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

Apache spark 单独分区中RDD的数据帧列表,apache-spark,pyspark,cluster-computing,rdd,partitioning,Apache Spark,Pyspark,Cluster Computing,Rdd,Partitioning,我有一个spark数据帧列表,我必须对它们执行一些操作 我想从这个rdd创建一个rdd,这样每个数据帧都在一个单独的分区中,这样我就可以简单地使用这个rdd上的mapPartitions在单独的节点上并行地对每个数据帧执行计算。下面是一些实现这一点的代码。一般的方法是将所有数据合并在一起,并添加一个源列来标记每行的来源。union调用不应该更改数据帧的分区,只需将所有分区合并到一个uber数据帧中即可。如果确实存在导致重新洗牌的内容,可以使用spark\u partition\u id添加具有原

我有一个spark数据帧列表,我必须对它们执行一些操作
我想从这个rdd创建一个rdd,这样每个数据帧都在一个单独的分区中,这样我就可以简单地使用这个rdd上的mapPartitions在单独的节点上并行地对每个数据帧执行计算。

下面是一些实现这一点的代码。一般的方法是将所有数据合并在一起,并添加一个源列来标记每行的来源。union调用不应该更改数据帧的分区,只需将所有分区合并到一个uber数据帧中即可。如果确实存在导致重新洗牌的内容,可以使用spark\u partition\u id添加具有原始分区id的列,然后对源和分区id列调用重新分区

从pyspark.sql.functions导入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] 为union设置DF。它们的列需要具有相同的顺序和顺序 添加源列 df1_union=df1.selectlitdf1.aliassource,*[colc代表sorteddf1.columns中的c] df2_union=df2.selectlitdf2.aliassource,*[colc代表sortedDdf2.columns中的c] 如果模式不同,您可以这样做 df1_union=df1.selectlitdf1.aliassource,struct*df1.columns.aliasdf1,litNone.aliasdf2 df2_union=df2.selectlitdf2.aliassource,litNone.aliasdf1,struct*df2.columns.aliasdf2 组合=df1_联合。联合所有DF2_联合 综合表演 combined.rdd.mapPartitionslambda行:执行任何操作。。 注意,以下是组合的数据:

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

每个数据帧的架构是相同的,还是有不同的列?@RyanWidmaier。。所有数据帧的模式都相同。由于我要执行的计算涉及滚动计算,如运行求和等,并且每个数据帧都是不同对象的数据,因此我不希望不同的数据帧位于同一分区中,因为滚动计算将计算错误。谢谢您的回答。在这种情况下,分区会基于源列进行吗?我的意思是,同一个源的所有数据都会进入同一个分区吗?我想对来自每个源的数据执行运行求和,因此在同一分区中不能有不同的源数据。非常感谢您的帮助…非常感谢…在上面的示例中不会发生任何混乱。Union只是将列出的数据帧中的所有原始分区放在一个DF中,而不移动任何行。你可以运行组合。解释一下。换句话说,如果您有带有分区A和B的DF1,以及带有分区C和D的DF2,那么组合起来的将有分区A、B、C和D。单个数据帧没有任何分区。我只是从拼花文件中读取它们。这是否意味着每个单独的数据帧都将与UnionAll一起转到单独的分区?对不起,我是新手。非常感谢..这有点让人困惑,分区有时意味着一个输入分割了一些记录,有时是一个数据片,按值划分,即按月划分。在这方面,我指的是前者。拼花读取器将加载您的数据,将记录分成多个输入部分,以便并行处理。如果执行df.rdd.getNumPartitions,您可以看到它创建了多少个分区。或者,您可以查看Spark UI中的任务数量。UnionAll工作,最终rdd有两个分区,每个数据帧一个分区。但是,有些输入数据帧有两个分区。我想把它们也移到1,这样最终rdd的分区数就和数据帧数一样多?另外,从mapPartitions上的操作后生成的rdd中,如何分割对应于每个输入数据帧的输出以分离输出数据帧?