【问题标题】:Align Dataset partitioning to table partitioning scheme将数据集分区与表分区方案对齐
【发布时间】:2020-04-19 20:04:22
【问题描述】:

我正在写入按月分区的表。我知道我的数据约为每个分区 100MB,没有偏差——它将适合单个 HDFS 块,我想确保每个分区都写入一个文件。我也知道我的数据集中的确切月数(介于 1 到 10 之间),因此:

ds.repartition(nMonths, $"month").write.<options>.insertInto(<...>)

这行得通。但是我从这里开始考虑......由于 Spark 使用密钥的哈希来确定分区,我不能保证每个分区都会收到一个月的数据。我拥有的分区越多,这实际上就越不可能 - 对吧?

那么将分区数增加到不同键数以上是否有意义?

ds.repartition(nMonths * 3, $"month").write.<options>.insertInto(<...>)

很多分区将是空的,但这不应该是那么痛苦(应该吗?),我们正在降低一些不幸的分区获得 3x/4x 数据的可能性,从而增加整体执行时间。这有意义吗?关于这个因素有什么经验法则吗?或者任何其他方法可以达到同样的效果?

【问题讨论】:

    标签: apache-spark partitioning


    【解决方案1】:

    如果你想超级安全,可以使用range partitioning,类似:

    ds.repartitionByRange(nMonths,$"month").write...
    

    这样您也不会有空分区,这反过来意味着您也不会在 HDFS 中生成零大小的文件。

    【讨论】:

    • 酷,我很惊讶它还能很好地处理像 201907..202006 这样的范围(从Int 的角度来看,这里有 201913..201999 的差距)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    相关资源
    最近更新 更多