【问题标题】:How to use .unionAll() in a reduce expression to create single dataframe如何在 reduce 表达式中使用 .unionAll() 来创建单个数据框
【发布时间】:2016-11-10 07:59:56
【问题描述】:

我正在尝试学习使用像reduce 这样的函数式编程结构,并且我正在尝试了解如何将它与union 多个dataframes 一起使用。我能够通过一个简单的 for 循环来完成它。您可以看到注释掉的expr 这是我的尝试,我遇到的问题是reducePython 函数,所以我将PythonSpark 代码交错同一个函数,编译器不高兴。

这是我的代码:

df1 = sqlContext.createDataFrame(
        [
            ('1', '2', '3'),
        ],
        ['a', 'b', 'c']
    )

df2 = sqlContext.createDataFrame(
    [
        ('4', '5', '6'),
    ],
    ['a', 'b', 'c']
)

df3 = sqlContext.createDataFrame(
    [
        ('7', '8', '9'),
    ],
    ['a', 'b', 'c']
)

l = [df2, df3]

# expr = reduce(lambda acc, b: acc.unionAll(b), l, '')
for df in l:
    df1 = df1.unionAll(df)

df1.select('*').show()

【问题讨论】:

    标签: python apache-spark dataframe pyspark apache-spark-sql


    【解决方案1】:

    您为reduce 提供了不正确的初始值,这会导致您调用

    ''.unionAll(b)
    

    而且应该很明显这没有意义。要么放弃initial

    reduce(lambda acc, b: acc.unionAll(b), l) if l else None
    

    或将'' 替换为具有有效架构的DataFrame

    first, *rest = l
    reduce(lambda acc, b: acc.unionAll(b), rest, first)
    

    也不需要 lambda 表达式:

    from pyspark.sql import DataFrame
    
    reduce(DataFrame.unionAll, rest, first)
    

    如果你有冒险的心情,你甚至可以打猴子补丁DataFrame

    DataFrame.__add__ = DataFrame.unionAll
    sum(rest, first)
    

    另一方面,不截断沿袭的迭代联合并不是 Spark 中的最佳想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 2018-12-04
      • 1970-01-01
      • 2016-11-04
      • 2022-11-22
      • 2018-03-03
      相关资源
      最近更新 更多