【问题标题】:How to spark partitionBy/bucketBy correctly?如何正确触发 partitionBy/bucketBy?
【发布时间】:2021-05-01 21:12:42
【问题描述】:

第一季度。在连接之前对数据进行临时(动态)重新分区是否有助于避免改组,或者改组是否会在重新分区时发生并且没有办法逃脱?

第二季度。我应该重新分区/partitionBy/bucketBy 吗?如果我将来根据列日和用户ID加入,正确的方法是什么? (我将结果保存为带有 .write.saveAsTable 的配置单元表)。我想按天分区并按 user_id 存储,但这似乎会创建数千个文件(请参阅Why is Spark saveAsTable with bucketBy creating thousands of files?

【问题讨论】:

  • @Hanan_Shteingart 对于第一季度,不能保证在加入之前进行重新分区会消除 shuffle 。除非有可以广播的小数据帧,否则肯定会洗牌。

标签: apache-spark partitioning partition-by


【解决方案1】:

我脑海中出现了一些“指导”,指出标题和正文在一定程度上有所不同:

问题一:

  • JOIN 将自动执行所需的任何(散列)分区/重新分区 - 如果需要并且如果不使用广播 JOIN。你可以 设置要洗牌的分区数或使用默认值 - 200。 有更多方 (DF) 需要考虑。

  • 重新分区是一种转换,因此由于 Catalyst 优化,可能根本不会执行任何预先重新分区 - 请参阅从 .explain 生成的 physical plan。这就是与懒惰的交易 评估 - 在行动时确定是否需要某些东西 调用。

问题 2:

  • 如果您有一个用例来JOIN 某些输入/输出定期,那么使用Spark 的bucketBy 是一个不错的方法。它避免了洗牌。这 databricks 文档清楚地表明了这一点。

  • 使用 bucketBy 的 Spark 架构不兼容Hive。所以这些仍然是 Spark 唯一的表,除非最近发生了变化。

  • 您所说的使用 Hive 分区取决于下推逻辑、分区修剪等。它应该也可以工作,但您可能有 读取后 Spark 框架内不同数量的分区。 这比说我有 N 个分区要复杂一些,所以我会 在初始读取时获得 N 个分区。

【讨论】:

    猜你喜欢
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2014-02-10
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2011-06-02
    相关资源
    最近更新 更多