【问题标题】:Worker Behavior with two (or more) dataframes having the same key具有相同键的两个(或更多)数据帧的工作人员行为
【发布时间】:2016-01-07 23:11:35
【问题描述】:

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

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

例如:

  • dfA 包含 {userid, firstname, lastname} 被userid分区

  • dfB 包含由userid 分区的{userid, activity, job, hobby}

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

dfC 是否已被userid 分区?

【问题讨论】:

    标签: apache-spark pyspark apache-spark-sql partitioning parquet


    【解决方案1】:

    dfC 是否已被userid 分区

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

    您将在How to define partitioning of DataFrame? 中找到有关DataFrames 和分区的更多详细信息,您可以关注的另一个问题是Co-partitioned joins in spark SQL

    如果我加入两个DataFrames,是否会在同一个工作人员上进行加入处理?

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

    需要明确的是,即使DataFrame 有一个分区器,它也是完全相同的。数据共同分区并不等同于数据共同定位。它只是意味着join 操作可以使用一对一的映射而不是洗牌来执行。您可以在Daniel Darbos' 回复Does a join of co-partitioned RDDs cause a shuffle in Apache Spark? 中找到更多信息。

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 2020-01-28
      • 1970-01-01
      • 2021-12-15
      • 2018-10-05
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多