我正在Databricks中创建一个Delta表,其中包含1天价值的代理日志(亿万行)。我希望能够按小时对表进行分区,因此仅通过'_time'列对表进行分区是不够的。另外,我正在使用%sql运行时在笔记本中创建表,但是如果这样做更好,我愿意在scala中创建表。
如何创建分区逻辑,以便为每个小时的日志创建一个新分区?
我的_time列的格式如下。
yyyy-mm-ddThh:mm:ss.xxxxxx-time:zone,其中时间和区域为2位数字。
因此,我想每隔一个小时进行一次分区,这样每天给我24个分区。
yyyy-mm-ddThh
答案 0 :(得分:0)
您需要创建单独的列以对数据集进行分区。在SQL语法中,您可以使用date
和hour
来获取您感兴趣的值,然后在查询中使用它,例如
CREATE TABLE events
USING delta
PARTITIONED BY(date, hour)
AS SELECT *, date(_time) as date, hour(_time) as hour from myData
这将导致您的三角洲湖泊按日期和小时进行分区,实际上在磁盘上看起来像:
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|