【问题标题】:Convert Array to Columns and replace values将数组转换为列并替换值
【发布时间】:2023-01-05 18:10:56
【问题描述】:

我有以下格式的数据:

+-----+---------------+
| name|           Data|
+-----+---------------+
|Alpha|      [A, B, C]|
| Beta|   [A, B, C, D]|
|Gamma|[A, B, C, D, E]|
+-----+---------------+

怎么改造成?

+-----+----+-----+-----+-----+-----+
| name|   A|    B|    C|    D|    E|
+-----+----+-----+-----+-----+-----+
|Alpha|   1|    1|    1|    0|    0|
| Beta|   1|    1|    1|    1|    0|
|Gamma|   1|    1|    1|    1|    1|
+-----+----+-----+-----+-----+-----+

感谢@Jarrod Baker 在类似transformation earlier 中的帮助

这是我的代码:

val df = Seq(
      ("Alpha", Array("A", "B", "C")),
      ("Beta", Array("A", "B", "C", "D")),
      ("Gamma", Array("A", "B", "C", "D", "E")),
).toDF("name", "Data")
df.show()

val arrayDataSize = df.withColumn("arr_size", size(col("Data"))).agg(max("arr_size") as "maxSize") 

val newDF = df.select(($"name") +: (0 until arrayDataSize.first.getInt(0)).map(i => {($"Data") (i).contains("A").alias("A") }): _*)

newDF.show()
+-----+----+-----+-----+-----+-----+
| name|   A|    A|    A|    A|    A|
+-----+----+-----+-----+-----+-----+
|Alpha|true|false|false| null| null|
| Beta|true|false|false|false| null|
|Gamma|true|false|false|false|false|
+-----+----+-----+-----+-----+-----+

在此先感谢您的帮助。

【问题讨论】:

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


【解决方案1】:

你可以使用RelationalGroupedDatasetpivot方法来实现你想要的。要创建这样的数据集,您需要在数据集上使用groupBy

它看起来像这样:

import spark.implicits._

val df = Seq(
  ("Alpha", Seq("A", "B", "C")),
  ("Beta", Seq("A", "B", "C", "D")),
  ("Gamma", Seq("A", "B", "C", "D", "E"))
).toDF("name", "Data")

val output = df
  .select(df("name"), explode(col("Data")).alias("Data"))
  .groupBy("name")
  .pivot("Data")
  .count()

output.show()
+-----+---+---+---+----+----+
| name|  A|  B|  C|   D|   E|
+-----+---+---+---+----+----+
| Beta|  1|  1|  1|   1|null|
|Gamma|  1|  1|  1|   1|   1|
|Alpha|  1|  1|  1|null|null|
+-----+---+---+---+----+----+

如您所见,我们首先explode-ing 我们的序列到单独的行中。这允许我们将每个序列中的每个元素视为一个单独的“实体”。

然后,我们使用groupBy 来获取我们的RelationalGroupedDataset,之后我们使用pivotcount 出现。

【讨论】:

    猜你喜欢
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 2022-01-16
    相关资源
    最近更新 更多