【问题标题】:What is the advantage of partitioning a delta / spark table by year / month / day, rather than just date?按年/月/日划分增量/火花表有什么好处,而不仅仅是日期?
【发布时间】:2022-01-17 22:37:45
【问题描述】:

在许多数据湖中,我看到数据按年、月、日划分,例如:

year=2019 / month=05 / day=15

与简单地按日期分区相比,这样做有什么优势?例如:

date=20190515

我能想到的唯一优势是,例如,如果分析师想要查询特定月/年的所有数据。如果只是按日期进行分区,那么他们将不得不编写一个对分区键进行计算的查询,例如下面的伪代码:

SELECT * FROM myTable WHERE LEFT(date,4) = 2019

spark 仍然可以对上述查询进行分区修剪吗? 更嵌套的分区结构还有其他我没有考虑到的优点吗?

谢谢

【问题讨论】:

    标签: apache-spark databricks delta-lake


    【解决方案1】:

    我认为这是一个劣势!因为拆分日期部分会使日期过滤变得更加困难。例如,您要查询最近 10 天的可能跨月边界的数据?使用单个日期值,您可以运行简单的查询,例如

    ...where date >= current_date() - interval 10 days

    Spark 会为您找出正确的分区。 Spark 还可以处理其他日期函数,例如 year(date) = 2019month(date) = 2,它会再次为您正确进行分区修剪。

    我总是鼓励使用单个日期列进行分区。让 Spark 完成这项工作。

    另外,要记住的重要一点是日期格式应为yyyy-MM-dd

    【讨论】:

    • 此外,Metastore 中的分区数也有上限。经过十多年的历史+未来数据,每天一个会导致问题
    • Delta Lake (delta.io) 通过可扩展的元数据处理帮助解决这些问题和其他问题。但同样的答案也适用,没有理由将日期分成单独的列,这最终会损害数据的可用性。
    • 感谢西尔维奥! Spark 在年过滤时仍然能够进行分区修剪吗?例如:SELECT * FROM myTable WHERE LEFT(date,4) = 2019
    • 看我上面的例子,你应该只使用year(date) = 2019函数,但是列需要是一个实际的日期值(例如2019-01-20
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 2018-06-18
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    相关资源
    最近更新 更多