分区投影:在日期上添加前导为0的填充

0

【以下的问题经过翻译处理】 我的创建表的SQL如下(表结构大大简化)。我正在使用Partition Project。

我正在尝试弄清楚如何处理日期字符串。为了更轻松地进行SQL查询,我希望日期具有前导0,例如“2022/09/06”。 然而,S3存储桶不幸地使用了非填充0,例如“2022/9/6”。

是否有一种方法可以修改下面的查询来实现这一点?如果我只是将行'projection.dt.format'='yyyy/M/d'更改为'projection.dt.format'='yyyy/MM/dd',那么表分区将无法捕捉到像“2022/9/6”这样的日期。

CREATE EXTERNAL TABLE IF NOT EXISTS TableName (
  userkey string,
  id string,
  createdon string,
  siteid int,
 --snipped---
)
PARTITIONED BY ( 
  `dt` string)
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe' 
WITH SERDEPROPERTIES ( 
  'ignore.malformed.json'='true') 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://company-log-split/{{NetworkIdHandler.value}}/company-log'
TBLPROPERTIES (
  'projection.enabled'='true', 
  'projection.dt.format'='yyyy/M/d', 
  'projection.dt.interval'='1', 
  'projection.dt.interval.unit'='DAYS', 
  'projection.dt.range'='NOW - 3 MONTHS,NOW + 5 YEARS', 
  'projection.dt.type'='date',
  'storage.location.template'='s3://company-log-split/{{NetworkIdHandler.value}}/company-log/${dt}'
) 

profile picture
专家
已提问 5 个月前4 查看次数
1 回答
0

【以下的回答经过翻译处理】 您好,

正如您正确指出的那样,Athena查询只能在“storage.location.template”中的日期分区格式与S3存储桶中的实际路径匹配时才能拾取底层日期分区和数据。由于“storage.location.template”中的“${dt}”路径格式取决于“projection.dt.format”中定义的日期格式,因此无法使用Athena分区投影将零填充格式定义或映射为非零填充格式。

一个可能的解决方法是使用传统的Hive分区而不是分区投影,例如,在创建表时不使用分区投影,然后可以使用ALTER TABLE ADD PARTITION手动查询或以编程方式添加和映射日期分区到s3路径:

ALTER TABLE my_table_name ADD PARTITION (dt = '2022/09/06') LOCATION 's3://mystorage/path/to/2022/9/6/';

为了以编程方式批量添加分区,您可以使用自定义Python脚本构建Athena查询,并通过start_query_execution API执行它们。 参考:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/athena.html#Athena.Client.start_query_execution

profile picture
专家
已回答 5 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则