我有一個看起來像這樣的資料框:
| 鑰匙 | 字 |
|---|---|
| 1 | ['一個測驗'] |
| 2 | ['你好呀] |
我想創建以下哈希圖:
Map(1 -> ['a', 'test'], 2 -> ['hi', 'there'])
但是我不知道如何做到這一點,有人可以幫助我嗎?
謝謝!
uj5u.com熱心網友回復:
必須有幾十種方法來做到這一點。一種是:
df.collect().map { case row => (row.getAs[Int](0) -> row.getAs[mutable.WrappedArray[String]](1))}.toMap
uj5u.com熱心網友回復:
這與此問題中的解決方案非常相似。下面應該給你你想要的輸出。它將所有地圖收集為一個集合,然后使用 UDF 創建單個地圖。這伴隨著關于 UDF 函式潛在性能不佳的常見警告。
import org.apache.spark.sql.functions.{col, map, collect_list, lit}
import org.apache.spark.sql.functions.udf
val joinMap = udf { values: Seq[Map[Int, Seq[String]]] =>
values.flatten.toMap
}
val df = Seq((1, Seq("a", "test")), (2, Seq("hi", "there"))).toDF("key", "words")
val rDf = df
.select(lit(1) as "id", map(col("key"), col("words")) as "kwMap")
.groupBy("id")
.agg(collect_list(col("kwMap")) as "kwMaps")
.select(joinMap(col("kwMaps")) as "map")
rDf.show
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/316319.html
