如何将具有嵌套元素的列从其他列添加到数据框(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)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过使用数据框中的其他列来聚合熊猫数据框中的列

如何将原始数据框中的列添加到报废数据?

将字典列表的 Python 数据框列转换为具有单个元素的列

将具有最接近值的列添加到 PySpark Dataframe

使用 pyspark 将 Spark 数据框中的列转换为数组 [重复]

如何使用具有不同列号pyspark的两个数据帧的并集