如何根据行Spark DataFrame的数组值创建新的行和列[重复]

Posted

技术标签:

【中文标题】如何根据行Spark DataFrame的数组值创建新的行和列[重复]【英文标题】:How to make new rows and columns based on array value of row Spark DataFrame [duplicate] 【发布时间】:2021-05-22 20:30:19 【问题描述】:

我有 2 列的数据框: uid:字符串 访问:数组

我需要创建一个包含 3 列的新 df: uid |时间戳(访问时间戳:时间戳)| url(来自访问的url:url)

我对 scala 和 spark 有点陌生,所以我不知道如何以正确的方式映射它。

例如,如果我有这样的 df:

uid |访问次数

uid1 | [[timestamp1:url1,timestamp2:url2]]

我需要这样:

uid |时间戳 |网址

uid1 |时间戳1 |网址1

uid1 |时间戳2|网址2

【问题讨论】:

【参考方案1】:

使用explodeexplode_outer 函数来分解数组列。

检查下面的代码。

scala> df.printSchema
root
 |-- uid: string (nullable = true)
 |-- visits: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- timestamp: long (nullable = true)
 |    |    |-- url: string (nullable = true)

scala> df
.withColumn("visits",explode_outer($"visits"))
.select($"uid",$"visits.timestamp".as("timestamp"),$"visits.url")
.show(false)

+---+---------+---+
|uid|timestamp|url|
+---+---------+---+
|uid|111      |url|
+---+---------+---+

【讨论】:

以上是关于如何根据行Spark DataFrame的数组值创建新的行和列[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark 的空 Dataframe 中添加行记录

如何从 Spark DataFrame 中选择稳定的行子集?

根据列值有效地从宽 Spark Dataframe 中删除列

如何提高具有数组列的 DataFrame 的 Spark SQL 查询性能?

Spark Dataframe - 将行作为输入和数据框具有输出的方法

如何将 Spark Dataframe 列转换为字符串数组的单列