【问题标题】:Databricks - how is number of partitions determined?Databricks - 如何确定分区数?
【发布时间】:2021-01-09 03:52:33
【问题描述】:

我正在处理一个文件,在将其保存为增量之前,我运行了 repartition(48, key)。在初始运行时,它在增量中生成大约 25 个分区(没有问题,因为密钥可能导致数据落入 25 个分区 - 我认为它不一定为没有数据的节点创建分区?)。

但是,在通过 MERGE 完成的第二次运行中,生成了 60 多个分区文件(这是一个 SCD 进程,预先存在 1700 个密钥,只有 300 个新密钥)

我的理解是repartition使用哈希算法来确定一个key属于哪个分区,那么如果是这样的话,它是如何创建的分区文件比定义的分区多的呢?

代码示例:

df = spark.read...
  
key = ["COL_A"]
partitions = 48
df.repartition(partitions, *[col(c) for c in key])

【问题讨论】:

  • 请提供df.explain日志和您的代码以便更好地理解
  • 我在已编辑的帖子中添加了我的代码正在执行的基本操作。我在此之后直接放入了 df.explain 但它只是脱口而出列,df.explain 需要去哪里?我应该寻找什么来解释为什么它超出了请求的 48 个分区?
  • 您能否分享您用于 MERGE 的完整代码以及您在 Spark 会话或表属性中应用的 Delta 选项?

标签: apache-spark databricks delta-lake


【解决方案1】:

“重新分区”操作是在原始数据帧上进行的,在将其转换为 delta-lake 后,它不会保留这些重新分区设置。 创建 delta-lake 后,合并操作将找到与 whenMatched 条件匹配的分区,并将其替换为新数据。如您所见,它跳过了大量数据并提高了性能。同样,您可以添加/附加新数据,这些数据也可能作为新分区出现。您需要 Optimize yor delta-lake 来整合新数据更改时创建的小文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-29
    • 2022-12-18
    • 2015-08-19
    • 2020-12-24
    相关资源
    最近更新 更多