sql - 按日期列的子集对增量表进行分区

标签 sql partitioning databricks delta-lake

我正在 Databricks 中创建一个增量表,其中包含 1 天的代理日志(数百行数百万行)。我希望能够按小时对表进行分区,因此简单地按“_time”列对表进行分区是不够的。另外,我使用 %sql 运行时在笔记本中创建表,但如果这是更好的选择,我愿意在 Scala 中创建它。

如何创建分区逻辑,以便为每个小时的日志创建一个新分区?

我的_time列的格式如下。

yyyy-mm-ddThh:mm:ss.xxxxxx-time:zone 其中时间和区域是 2 位数字。

所以,我想对每个独特的小时进行分区,一天有 24 个分区,就像这样。

yyyy-mm-ddThh

最佳答案

您需要创建单独的列来对数据集进行分区。在 SQL 语法中,您可以使用 datehour 获取您感兴趣的值,然后在查询中使用它,例如

CREATE TABLE events
USING delta
PARTITIONED BY(date, hour)
AS SELECT *, date(_time) as date, hour(_time) as hour from myData

这将导致您的 Delta Lake 按日期和时间分区,物理上在磁盘上大致如下所示:

delta/events/date=2019-01-01/
  |-delta/events/date=2019-01-01/hour=0/
  |-delta/events/date=2019-01-01/hour=1/
(...)
delta/events/date=2019-01-02/
(...)   

请记住,这会将这两列添加到您的增量数据中,但我想不出一种按不属于表的内容进行分区的方法(PARTITION BY hour(x)不会工作)。

+---+-------------------+----------+----+
| id|              _time|      date|hour|
+---+-------------------+----------+----+
| 71|2019-01-16 12:31:00|2019-01-16|  12|
|108|2019-01-16 12:31:00|2019-01-16|  12|

关于sql - 按日期列的子集对增量表进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59050606/

相关文章:

Mysql - 根据条件删除重复行的sql查询

sql-server - 寻找 SQL 2005 分区的一个很好的总结

python - 将 Spark SQL 数据帧转换为 Pandas 数据帧

scala - 如何在 Spark jar 中使用 dbutils.secrets

android - 错误 "is not a JSONObject"

c# - MMO 服务器 - 优化用户状态数据的数据库访问

sql - 在 SQL Server 数据库中查找分区架构定义

performance - Postgres 中有多少个表分区太多?

python - Databricks 文件系统 - 根据日期复制文件

sql - postgresql 两个 NOT LIKE 子句返回错误结果