2017-07-14 5 views

答えて

2

これは、UDFを使用して行うことができます。

import spark.implicits._ 
import org.apache.spark.sql.functions._ 
import org.apache.spark.sql.Row 

// Sample data: 
val df = Seq(
    ("id1", "t1", Array(("n1", 4L), ("n2", 5L))), 
    ("id2", "t2", Array(("n3", 6L), ("n4", 7L))) 
).toDF("ID", "Time", "Items") 

// Create UDF converting array of (String, Long) structs to Map[String, Long] 
val arrayToMap = udf[Map[String, Long], Seq[Row]] { 
    array => array.map { case Row(key: String, value: Long) => (key, value) }.toMap 
} 

// apply UDF 
val result = df.withColumn("Items", arrayToMap($"Items")) 

result.show(false) 
// +---+----+---------------------+ 
// |ID |Time|Items    | 
// +---+----+---------------------+ 
// |id1|t1 |Map(n1 -> 4, n2 -> 5)| 
// |id2|t2 |Map(n3 -> 6, n4 -> 7)| 
// +---+----+---------------------+ 

私は(唯一のスパークの組み込み関数を使用して)UDFせずにこれを行う方法を参照することはできません。

関連する問題