簡體   English   中英

將行轉換為spark scala中的map

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM