具有相同键的两个(或更多)数据帧的工作人员行为

Worker Behavior with two (or more) dataframes having the same key

我在集群中使用 PySpark (Spark 1.4.1)。我有两个 DataFrame,每个都包含相同的键值,但其他字段的数据不同。

我使用密钥分别对每个DataFrame进行分区,并将一个parquet文件写入HDFS。然后我将 parquet 文件作为新的 DataFrame 读回内存。如果我加入两个 DataFrame,加入的处理会发生在同一个 worker 上吗?

例如:

dfC = dfA.join(dfB, dfA.userid==dfB.userid)

dfC 是否已被 userid 分区?

Is dfC already partitioned by userid

答案取决于您所说的分区是什么意思。具有相同 userid 的记录应位于同一分区,但 DataFrames 不支持理解为具有 Partitioner 的分区。只有 PairRDDs (RDD[(T, U)]) 可以在 Spark 中有分区器。这意味着对于大多数应用来说,答案是否定的。 DataFrame 或底层 RDD 均未分区。

您将在 Another question you can follow is 中找到有关 DataFrames 和分区的更多详细信息。

If I join the two DataFrames, will the processing for the join happen on the same workers?

再一次,这取决于你的意思。在生成转换行之前,必须将具有相同 userid 的记录传输到同一节点。我问是否保证在没有任何网络流量的情况下发生,答案是否定的。

需要说明的是,即使 DataFrame 有一个分区器,它也会完全一样。数据协同分区不等同于数据协同定位。它只是意味着可以使用一对一映射而不是混洗来执行 join 操作。您可以在 Daniel Darbos' answer to .

中找到更多信息