2017-09-11 39 views
1

我有一行數據框,我想將其轉換爲Map [String,Any],它將列名映射到該列的行中的值。將行轉換爲spark scala中的映射

有沒有簡單的方法來做到這一點?

我是做字符串值像

def rowToMap(row:Row): Map[String, String] = { 
row.schema.fieldNames.map(field => field -> row.getAs[String](field)).toMap 
} 

val myRowMap = rowToMap(myRow) 

如果該行包含其他值,而不是具體的像字符串,則代碼獲取混亂,因爲該行沒有AA方法.get(field)

任何想法?

+0

分享投入和預期產出方案 – BDR

回答

1

您可以使用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的返回值類型可以標記爲任何類型,所以您不能依賴它來找出您具有的數據類型,但需要記住從頭開始具有的內容。

0

你可以把你dataframerdd和使用簡單的map功能,並在MAP形成用headernamesmap功能,最後用collect

val fn = df.schema.fieldNames 
val maps = df.rdd.map(row => fn.map(field => field -> row.getAs(field)).toMap).collect() 
0

比方說,你有列的數據幀[時間(時間戳類型),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 
} 
相關問題