Spark 将字符串数组分解为列

Ofi*_*fir 9 java arrays apache-spark apache-spark-sql pyspark

我将 Spark 与 Java 结合使用,并且有一个如下所示的数据框:

id  | array_column
-------------------
12  | [a:123, b:125, c:456]
13  | [a:443, b:225, c:126]
Run Code Online (Sandbox Code Playgroud)

我想array_column用相同的 id 进行爆炸,但是explode不起作用,因为我希望数据框变成:

id  | a  | b  | c
-------------------
12  |123 |125 | 456 
13  |443 |225 | 126
Run Code Online (Sandbox Code Playgroud)

ggo*_*don 7

以下方法适用于array_column. 该方法用于在将每个字符串元素分别分成两个不同的列和之前explode扩展字符串元素列表。最后,将数据透视表与 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")
)
Run Code Online (Sandbox Code Playgroud)

让我知道这是否适合您。


wer*_*ner 5

与 ggordon 在 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();
Run Code Online (Sandbox Code Playgroud)

输出:

+---+---+---+---+
| id|  a|  b|  c|
+---+---+---+---+
| 12|456|225|126|
| 11|123|125|456|
+---+---+---+---+
Run Code Online (Sandbox Code Playgroud)

我假设id和 以及数组中关键字段的组合是唯一的。这就是为什么使用的聚合函数//1first。如果此组合不唯一,则可以更改聚合函数collect_list以获得所有匹配值的数组。