【发布时间】:2020-12-30 23:34:36
【问题描述】:
我希望对可变数量的 PySpark 数据帧的列进行重新排序(它们具有相同的列,但顺序不同)。 只要所有数据帧最终具有彼此相同的顺序,决定顺序的数据帧就无关紧要。 下面的函数适用于 2 个数据帧,我的问题是:这如何推广到任意数量的数据帧(2、3 等)?
def reorder_cols(df_1, df_2):
"""Reorder dataframe columns in df_1 based on order of columns in df_2."""
return df_1.select(df_2.schema.names)
我尝试过使用functools.reduce 并将函数签名定义为*dfs,但我不确定如何从这里开始:
from functools import reduce
def reorder_cols_r(*dfs):
"""Reorder dataframe columns recursively."""
return reduce(DataFrame.select, dfs)
我正在使用的一些测试数据:
# Test dataframes
df1 = spark.createDataFrame([(1, "foo1"), (2, "bar1")], ("a", "b"))
df2 = spark.createDataFrame([("foo2", 3), ("bar2", 4)], ("b", "a"))
df3 = spark.createDataFrame([(5, "foo3"), (6, "bar3")], ("a", "b"))
然后会以这种方式调用该函数:
reorder_cols_r(*[df1, df2, df3])
注意:应该适用于任意数量的列,只要它们存在于所有数据框中。为简单起见,上面仅使用了 2 列。
【问题讨论】:
标签: python dataframe apache-spark pyspark apache-spark-sql