首页 > 解决方案 > 如何在 Pyspark 中优化我的 Reduce 函数

问题描述

我正在尝试在数据框中的键之间创建映射。

我在 pyspark 数据框中有一个列 R_ID、V1、V2、V3 列。 在此处输入图像描述

我需要输出数据框来为我提供这些列之间的映射。我的结果应该是

在此处输入图像描述

我已经使用 Reduce 完成了这项工作,但是在使用大数据进行测试时遇到了性能问题

有人可以帮我弄这个吗?

标签: pyspark

解决方案


您可以分别选择每一v列,然后将它们合并在一起

输入

df = spark.createDataFrame([
    ('r1', 'v1', 'v2', 'v3'),
    ('r2', 'v4', 'v5', None),
    ('r3', None, 'v6', None),
], ['r', 'c1', 'c2', 'c3'])

# +---+----+---+----+
# |  r|  c1| c2|  c3|
# +---+----+---+----+
# | r1|  v1| v2|  v3|
# | r2|  v4| v5|null|
# | r3|null| v6|null|
# +---+----+---+----+

**v分别选择每一列

from pyspark.sql import functions as F

df1 = df.select('c1', 'r').where(F.col('c1').isNotNull())
# +---+---+
# | c1|  r|
# +---+---+
# | v1| r1|
# | v4| r2|
# +---+---+

df2 = df.select('c2', 'r').where(F.col('c2').isNotNull())
# +---+---+
# | c2|  r|
# +---+---+
# | v2| r1|
# | v5| r2|
# | v6| r3|
# +---+---+

df3 = df.select('c3', 'r').where(F.col('c3').isNotNull())
# +---+---+
# | c3|  r|
# +---+---+
# | v3| r1|
# +---+---+

然后将它们结合在一起

df1.union(df2).union(df3)

# +---+---+
# | c1|  r|
# +---+---+
# | v1| r1|
# | v4| r2|
# | v2| r1|
# | v5| r2|
# | v6| r3|
# | v3| r1|
# +---+---+

推荐阅读