单独分区中RDD的数据帧列表

时间:2018-06-27 14:30:38

标签: apache-spark pyspark cluster-computing rdd partitioning

我有一个spark数据帧列表,我必须对其执行一些操作 我想以此创建一个rdd,以使每个数据帧进入一个单独的分区,以便我可以简单地使用此rdd上的mapPartitions在各个节点上并行地对每个数据帧执行计算。

1 个答案:

答案 0 :(得分:1)

下面是一些实现此目的的代码。通用方法是将所有数据合并在一起,并添加一个source列以标记每一行的来源。联合调用不应更改 DataFrames 的分区,只需将所有分区组合到一个超级 DataFrame 中。如果确实有某些原因导致重新组合,则可以使用spark_partition_id()添加具有原始分区ID的列,然后在repartitionsource列上调用partition_id。 / p>

from pyspark.sql.functions import struct, lit, col

df1 = sc.parallelize([
    (1, 2, 3),
    (2, 3, 4)
]).toDF(["col1", "col2", "col3"])

df2 = sc.parallelize([
    (3, 4, 5),
    (4, 5, 6)
]).toDF(["col1", "col2", "col3"])

# Setup the DF's for union.  Their columns need to be in the same order and
# add a source column
df1_union = df1.select(lit("df1").alias("source"), *[col(c) for c in sorted(df1.columns)])
df2_union = df2.select(lit("df2").alias("source"), *[col(c) for c in sorted(df2.columns)])

# You could do this instead if the schemas are different
# df1_union = df1.select(lit("df1").alias("source"), struct(*df1.columns).alias("df1"), lit(None).alias("df2"))
# df2_union = df2.select(lit("df2").alias("source"), lit(None).alias("df1"), struct(*df2.columns).alias("df2"))

combined = df1_union.unionAll(df2_union) 

combined.show()
combined.rdd.mapPartitions(lambda row: do whatever..)

注意,这是合并后的数据的样子:

+------+----+----+----+
|source|col1|col2|col3|
+------+----+----+----+
|   df1|   1|   2|   3|
|   df1|   2|   3|   4|
|   df2|   3|   4|   5|
|   df2|   4|   5|   6|
+------+----+----+----+