首页 > 解决方案 > Spark将数组列爆炸到列

问题描述

我正在将 Spark 与 Java 一起使用,并且我有一个这样的数据框:

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

因此,在这种情况下,正常explode开启array_column效果不佳。

我很乐意为您提供帮助,谢谢!

标签: javaapache-sparkpysparkapache-spark-sqldataset

解决方案


以下方法适用于array_column. 该方法用于在将每个字符串元素拆分为两个不同的列之前分别explode扩展字符串元素列表。最后,pivot 与 group by 一起使用,将数据转置为所需的格式。array_column:col_namecol_val

以下示例使用 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")
)

让我知道这是否适合您。


推荐阅读