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)
以下方法适用于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)
让我知道这是否适合您。
与 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和 以及数组中关键字段的组合是唯一的。这就是为什么使用的聚合函数//1是first。如果此组合不唯一,则可以更改聚合函数collect_list以获得所有匹配值的数组。
| 归档时间: |
|
| 查看次数: |
6665 次 |
| 最近记录: |