【问题标题】:How to convert a map to individual columns in spark scala?如何将地图转换为 spark scala 中的单个列?
【发布时间】:2021-01-18 20:40:28
【问题描述】:

我有一个 spark 数据框,其值如下所示,我正在努力寻找将输入数据框转换为 Id、Fld1、Fld2 等单独列的方法。感谢任何帮助或指向执行此操作的文档的指针?

val df2  = Seq(
  ("1", Map("Fld1" -> "USA","Fld2" -> "UK")),
  ("2", Map("Fld1" -> "Germany", "Fld2" -> "Portugal"))
).toDF("id", "map")
df2.show()

输入:

+---+-----------------------------------+
|id |map | 
+---+-----------------------------------+
|1  |[Fld1 -> USA, Fld2 -> UK]          | 
|2  |[Fld1 -> Germany, Fld2 -> Portugal]|
+---+-----------------------------------+ 

预期输出:

+---+-------+--------+ 
| id| Fld1  | Fld2   | 
+---+-------+--------+
| 1 | USA   | UK     |
| 2 |Germany|Portugal|
+---+-------+--------+

【问题讨论】:

  • +---+----------------------------------- |id |地图 | +---+------------------------------------------------+- |1 |[Fld1 -> 美国, Fld2 -> 英国] | |2 |[Fld1 -> 德国,Fld2 -> 葡萄牙]| +---+------------------------------------------------+- +---+--- ----+--------+ |编号| Fld1| Fld2| +---+-------+--------+ | 1|美国|英国| | 2|德国|葡萄牙| +---+-------+--------+

标签: scala apache-spark apache-spark-sql


【解决方案1】:

这是高效的解决方案:

df2
  .withColumn("Fld1", $"map".getItem("Fld1"))
  .withColumn("Fld2", $"map".getItem("Fld2"))
  .drop("map")
  .show()
+---+-------+--------+
| id|   Fld1|    Fld2|
+---+-------+--------+
|  1|    USA|      UK|
|  2|Germany|Portugal|
+---+-------+--------+

另一个答案建议使用pivot,这可能真的很慢。

【讨论】:

    【解决方案2】:

    您可以使用selectExprexplode 映射,然后应用pivot,如下所示:

    .selectExpr("id", "explode(map)")
    .groupBy(col("id")).pivot(col("key")).agg(first(col("value")))
    
    // result
    +---+-------+--------+
    |id |Fld1   |Fld2    |
    +---+-------+--------+
    |1  |USA    |UK      |
    |2  |Germany|Portugal|
    +---+-------+--------+
    

    【讨论】:

      猜你喜欢
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 2020-02-09
      • 2015-07-10
      • 2020-08-11
      相关资源
      最近更新 更多