遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框

Posted

技术标签:

【中文标题】遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框【英文标题】:Iterate through columns in a dataframe of pyspark without making a different dataframe for a single column 【发布时间】:2017-03-10 11:28:30 【问题描述】:

我们如何遍历数据框中的列以单独对同一数据框中的某些或所有列执行计算,而不为单个列创建不同的数据框(类似于 map 遍历 rdd 中的行并对行执行计算没有为每一行制作不同的rdd)。 我达到了下面给出的解决方案。

l = list of column names
df = dataframe in pyspark
def plusone(df_column):
    return (df_column + 1)

df1 = df.select(map(lambda x: (plusone(getattribute(df,l[x]))) if x ==0 else getattribute(df,l[x]), range(len(l))))
print df1.show()

通过这种方式,我得到了一个数据框,其中包含我想要的特定列中的更改,而不是为列创建不同的数据框,然后与 df 合并并删除旧列。

此代码的问题是它不会在 spark 上分发,因为 map 会遍历列表。我想要这样的分布式方式。

P.S.- 我不想使用 rdd。

提前致谢!

【问题讨论】:

【参考方案1】:

不要使用地图,而是使用带有 spark udf 的数据框上的 with 列。 在 udf 中,以这种方式定义函数并执行您的逻辑:

    您没有使用不可并行化的列表 udf 及其内部的函数将传递给并行运行的每个执行器。

【讨论】:

如果我理解错误,请纠正我。你的意思是我应该在 udf 中使用 map 并简单地在 udf 中调用数据框?因为如果我只是使用没有映射的 udf,我将不得不手动传递 udf 中的每一列。我想在一行中处理所有列,而不是分别为每一列编写代码。 不,传递整个 row(x) 就像你已经在做 uisng lambda x 一样,而不是 map 定义 func() 在 udf 中执行你的逻辑

以上是关于遍历 pyspark 数据框中的列,而不为单个列创建不同的数据框的主要内容,如果未能解决你的问题,请参考以下文章

在 PySpark 数据框中的组中的列上应用函数

如何拆分对象列表以分隔pyspark数据框中的列

PySpark:将 RDD 转换为数据框中的列

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

加入后替换pyspark数据框中的列

将列表的列拆分为同一 PySpark 数据框中的多列