[英]Convert Row to map in spark scala
我有一個數據框的行,我想將它轉換為Map [String,Any],它將列名映射到該列的行中的值。
有一個簡單的方法嗎?
我是為字符串值做的
def rowToMap(row:Row): Map[String, String] = {
row.schema.fieldNames.map(field => field -> row.getAs[String](field)).toMap
}
val myRowMap = rowToMap(myRow)
如果該行包含其他值,而不是像String這樣的特定值,則代碼變得更加混亂,因為該行沒有方法.get(field)
有任何想法嗎?
你可以使用getValuesMap
:
val df = Seq((1, 2.0, "a")).toDF("A", "B", "C")
val row = df.first
要獲取Map[String, Any]
:
row.getValuesMap[Any](row.schema.fieldNames)
// res19: Map[String,Any] = Map(A -> 1, B -> 2.0, C -> a)
或者你可以為這個簡單的情況得到Map[String, AnyVal]
,因為這些值不是復雜的對象
row.getValuesMap[AnyVal](row.schema.fieldNames)
// res20: Map[String,AnyVal] = Map(A -> 1, B -> 2.0, C -> a)
注意 : getValuesMap
的返回值類型可以標記為任何類型,因此您不能依賴它來確定您擁有的數據類型,但需要記住您從一開始就擁有的內容。
你可以將你的dataframe
轉換為rdd
並使用簡單的map
函數,並在map
函數中的MAP
形式中使用headernames
,最后使用collect
val fn = df.schema.fieldNames
val maps = df.rdd.map(row => fn.map(field => field -> row.getAs(field)).toMap).collect()
假設您有一個包含以下列的數據框:
[time(TimeStampType), col1(DoubleType), col2(DoubleType)]
你可以這樣做:
val modifiedDf = df.map{row =>
val doubleObject = row.getValuesMap(Seq("col1","col2"))
val timeObject = Map("time" -> row.getAs[TimeStamp]("time"))
val map = doubleObject ++ timeObject
}
假設您有一行沒有結構信息,列標題為數組。
val rdd = sc.parallelize( Seq(Row("test1", "val1"), Row("test2", "val2"), Row("test3", "val3"), Row("test4", "val4")) )
rdd.collect.foreach(println)
val sparkFieldNames = Array("col1", "col2")
val mapRDD = rdd.map(
r => sparkFieldNames.zip(r.toSeq).toMap
)
mapRDD.collect.foreach(println)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.