如何根据行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】:使用explode
或explode_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 中删除列
如何提高具有数组列的 DataFrame 的 Spark SQL 查询性能?