日期列与字符串的 Athena 分区投影

2024-03-14

我希望使用 Athena Partition Projection 来分析来自 AWS 应用程序负载均衡器的日志文件和 Firehose 发出的日志。 S3 中的数据以年/月/日为前缀,也可能以小时为前缀。我已经能够使用消防水带示例 https://docs.aws.amazon.com/athena/latest/ug/partition-projection-kinesis-firehose-example.html;但是此示例使用字符串格式的分区列。

我正在寻找是否可以使用日期格式的分区列(使用分区项目和 firehose 发出的 s3 前缀格式),因为我们的查询编写器已经习惯了涉及日期列的大多数查询,并且它避免了需要相对日期查询的字符串格式。这是可能的还是需要更改 s3 前缀才能实现?

字符串列的表属性:WORKS

PARTITIONED BY ( 
  `logdate` string)
TBLPROPERTIES (
  'projection.enabled'='true', 
  'projection.logdate.format'='yyyy/MM/dd', 
  'projection.logdate.interval'='1', 
  'projection.logdate.interval.unit'='DAYS', 
  'projection.logdate.range'='NOW-2YEARS,NOW', 
  'projection.logdate.type'='date',
  'storage.location.template'='s3://bucket/prefix/${logdate}')

日期分区列的表属性不起作用

PARTITIONED BY ( 
  `logdate` date)
TBLPROPERTIES (
  'projection.enabled'='true', 
  'projection.logdate.format'='yyyy/MM/dd', 
  'projection.logdate.interval'='1', 
  'projection.logdate.interval.unit'='DAYS', 
  'projection.logdate.range'='NOW-2YEARS,NOW', 
  'projection.logdate.type'='date',
  'storage.location.template'='s3://bucket/prefix/${logdate}')

HIVE_INVALID_PARTITION_VALUE:DATE 分区键的分区值“2018/11/13”无效:logdate=2018%2F11%2F13


我认为你唯一需要做的就是确保的类型logdate分区键为string:

PARTITIONED BY (logdate string)

这与projection.logdate.type,这应该继续是date.

带类型的分区键date只是分区投影执行的计算中的日期。对于所有其他目的,它们都是字符串。 PP 将使用您指定的日期格式解析值,进行计算,然后使用相同的日期格式输出字符串。这种情况发生在查询计划期间,在涉及 Presto 引擎之前。

Presto 的读取模式方法意味着您可以说列具有类型date其格式是否与预期的日期格式匹配;yyyy-MM-ddJava 格式。您从 Firehose 的 S3 密钥获得的格式,yyyy/MM/dd, 无法投射到date自动,需要显式解析:

parse_datetime(logdate, 'yyyy/MM/dd')

我认为,如果 PP 能够了解分区键的类型,这样您就可以完成您尝试做的事情,那就太好了,但我认为,由于 PP 发生在查询计划期间,并且很可能不会靠近已知的事情类型可能很难实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

日期列与字符串的 Athena 分区投影 的相关文章

随机推荐