如何将具有嵌套元素的列从其他列添加到数据框(withColumn)[重复]
Posted
技术标签:
【中文标题】如何将具有嵌套元素的列从其他列添加到数据框(withColumn)[重复]【英文标题】:how to add a column with nested elements to a dataframe from other columns (withColumn) [duplicate] 【发布时间】:2018-11-30 15:29:35 【问题描述】:我有一个 PySpark 数据框,看起来像
C C1 C2 C3
1 2 3 4
我想添加另一个嵌套列,这将使数据框的该列成为 json 或对象,我什至不确定这是什么的正确措辞。它将从同一行的其他列中获取信息
C C1 C2 C3 V
1 2 3 4 "C:1", "C1:2", "C2:3", "C3:4"
我已经尝试过How to add a nested column to a DataFrame,但我不知道 PySpark 中的正确语法是什么,与那个问题相反,即 Scala,而且该解决方案看起来只适用于 1 行,我需要这样做数亿行。
我试过df2 = df.withColumn("V", struct("V.*", col("C1").as('C1')))
,但这会产生一个神秘的语法错误。
编辑:我不会说这个问题与pyspark convert row to json with nulls 重复,因为用户在此处发布的解决了我的问题的解决方案并未在此处发布。
如何从同一行的其余列中创建嵌套列 V
?
【问题讨论】:
as
是 Python 中的关键字。使用alias
- col("C1").alias('C1')
this 是您要找的吗?
@pault 这不是重复的,因为该页面上的解决方案不是我想要的,用户sailesh 解决了我的问题。他的解决方案没有出现在该页面上。此外,我消除了具有空值的行。这里不考虑空值。
【参考方案1】:
在 PySpark 中,您可以使用 struct 来实现。你不需要别名。
df.withColumn("V", struct(col("C"), col("C1"), col("C2"), col("C3"))
如果您不想对列名进行硬编码,也可以这样做
df.withColumn("V", struct(col("*"))
【讨论】:
使用此方法然后转换为 JSON 对于null
值将无法正常工作。以上是关于如何将具有嵌套元素的列从其他列添加到数据框(withColumn)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
将具有最接近值的列添加到 PySpark Dataframe