【问题标题】:Spark explode array column to columnsSpark将数组列爆炸到列
【发布时间】:2021-11-20 11:41:21
【问题描述】:

我在 Java 中使用 Spark,我有一个这样的数据框:

id  | array_column
-------------------
12  | [a:123, b:125, c:456]
13  | [a:443, b:225, c:126]

我想用相同的 id 分解 array_column,但是 explode 还不够,因为我希望数据框是:

id  | a  | b  | c
-------------------
12  |123 |125 | 456 
13  |443 |225 | 126

因此,在这种情况下,array_column 上的普通 explode 无法正常工作。

很高兴得到您的帮助,谢谢!

【问题讨论】:

  • 地图中的元素数量是固定的还是可以改变的?
  • @ArtemAstashov 号码不固定,但如果需要可以用大号屏蔽

标签: java apache-spark pyspark apache-spark-sql dataset


【解决方案1】:

以下方法适用于array_column 中的可变长度列表。该方法使用explode 扩展array_column 中的字符串元素列表,然后使用: 将每个字符串元素分别拆分为两个不同的列col_namecol_val。最后,将数据透视与 group by 一起使用,将数据转换为所需的格式。

以下示例使用 pyspark api,但可以轻松转换为 java/scala api,因为它们相似。我假设您的数据集位于名为 input_df

的数据框中
from pyspark.sql import functions as F

output_df = (
    input_df.select("id",F.explode("array_column").alias("acol"))
            .select(
                "id",
                F.split("acol",":")[0].alias("col_name"),
                F.split("acol",":")[1].cast("integer").alias("col_val")
            )
            .groupBy("id")
            .pivot("col_name")
            .max("col_val")
)

让我知道这是否适合你。

【讨论】:

    【解决方案2】:

    类似ggordon's answer in Java:

    import static org.apache.spark.sql.functions.*;
    
    Dataset<Row> df = ...
    
    df.withColumn("array_column", explode(col("array_column")))
            .withColumn("array_column", split(col("array_column"), ":"))
            .withColumn("key", col("array_column").getItem(0))
            .withColumn("value", col("array_column").getItem(1))
            .groupBy(col("id"))
            .pivot(col("key"))
            .agg(first("value")) //1
            .show();
    

    输出:

    +---+---+---+---+
    | id|  a|  b|  c|
    +---+---+---+---+
    | 12|456|225|126|
    | 11|123|125|456|
    +---+---+---+---+
    

    我假设id 和数组中的键字段的组合是唯一的。这就是//1 使用的聚合函数是first 的原因。如果这种组合不是唯一的,可以将聚合函数更改为collect_list,以获取所有匹配值的数组。

    【讨论】:

      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2018-06-27
      相关资源
      最近更新 更多