如何解决当数据类型为整数时,如何按日期对BigQuery中的表进行分区?
目前我有一个带有整数字段的表,其中日期值采用YYYYMMDD格式,目的是能够按此字段对表进行分区,而无需创建另一个字段或列
您有用于分区的示例代码吗?
谢谢
解决方法
要创建基于整数的分区表,必须使用GENERATE_ARRAY函数。
RANGE_BUCKET(<int64_column>,GENERATE_ARRAY(start_expression,end_expression[,step_expression]))
依次考虑日期(格式为YYYYMMDD)之类的字段 从20200101开始生成10000个数字范围(20200101-20210100) 从(2020-01-01至2020-12-31)大约存储一年 使用总分区1131(每100个分区30/31)和其他 不会使用分区范围(20201232-20210100),因为没有 有效的格式化日期。
现在开始回答,如果您有大约一年的日期使用下面的代码或 也有记载。
CREATE TABLE DATASET.T_TABLE_PAR
PARTITION BY RANGE_BUCKET(COD_DATE,GENERATE_ARRAY(20200101,20201231,1))
AS
SELECT COD_DATE,CLUSTER FROM DATASET.T_TABLE
我相信您有一年以上的日期数据。所以答案是,没有直接的方法可以做到这一点('无需创建另一个字段或列')。
如果您愿意存储更改的数据(20200201为20200132),我可以考虑解决方法。
--This function does the change,actual date to partition number and vice-versa,change start and end date as per your need.
create temp function date_get_set(date_code int64,type string)
as(
(
SELECT case when type='get' then a
when type='set' then b end
from (
SELECT cast(FORMAT_DATE("%Y%m%d",example) as int64) a,20200100+row_number() over(order by example asc) b
from UNNEST(GENERATE_DATE_ARRAY('2020-01-01','2021-12-31')) AS example)
where (case when type='get' then b
when type='set' then a end) = date_code
)
);
select date_get_set(20200132,'get') get_the_date,date_get_set(20200201,'set') set_the_partiontion
上述选择的输出:
现在创建上面的函数(持久删除温度)和分区表,如下所示。
CREATE TABLE DATASET.T_TABLE_PAR
PARTITION BY RANGE_BUCKET(COD_DATE,20202020,1))
AS
SELECT DATASET.date_get_set(COD_DATE,'set') COD_DATE,CLUSTER FROM DATASET.T_TABLE
要修剪查询并读取正确的日期值,请使用该功能。
SELECT DATASET.date_get_set(COD_DATE,'get'),CLUSTER
FROM DATASET.T_TABLE
where COD_DATE = DATASET.date_get_set(20200201,'set')
因此有两个不利条件,功能可能会增加一些计算成本,并且 更改数据(表上的视图将有帮助)。 :)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。