【问题标题】:Creating a table with partition projection results in an empty one使用分区投影创建表会导致空表
【发布时间】:2023-02-04 04:20:38
【问题描述】:

我正在基于 S3 存储桶中的 CSV 文件列表在 Athena 中创建一个表。存储桶中的文件放置在这样的文件夹中:

$ aws s3 ls s3://bucket-name/ --recursive
2023-01-23 16:05:01      25601 logs2023/01/23/23/analytics_Log-1-2023-01-23-23-59-59-6dc5bd4c-f00f-4f34-9292-7bfa9ec33c55
2023-01-23 16:10:03      18182 logs2023/01/24/00/analytics_Log-1-2023-01-24-00-05-01-aa2cb565-05c8-43e2-a203-96324f66a5a7
2023-01-23 16:15:05      20350 logs2023/01/24/00/analytics_Log-1-2023-01-24-00-10-03-87b03989-c059-4fca-8e8b-909e787db889
2023-01-23 16:20:09      25187 logs2023/01/24/00/analytics_Log-1-2023-01-24-00-15-06-6d9b39fb-c05f-4416-9b17-415f48e63591
2023-01-23 16:25:18      20590 logs2023/01/24/00/analytics_Log-1-2023-01-24-00-20-16-3939a0fe-8cfb-4168-bc8e-e71d2122add5

这是文件夹结构的格式:

logs{year}/{month}/{day}/{hour}/<filename>

我想使用 Athena 的分区投影,这就是我创建表格的方式:

CREATE EXTERNAL TABLE analytics.logs (
  id string, 
  ...
  type tinyint)
PARTITIONED BY (
    year bigint COMMENT '',
    month string COMMENT '',
    day string COMMENT '')
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://bucket-name/'
TBLPROPERTIES (
  'classification'='csv', 
  'partition.day.values'='01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31', 
  'partition.day.type'='enum', 
  'partition.enable'='true', 
  'partition.month.values'='01,02,03,04,05,06,07,08,09,10,11,12', 
  'partition.month.type'='enum', 
  'partition.year.range'='2022,2100', 
  'partition.year.type'='integer', 
  'storage.location.template'='s3://bucket-name/logs${year}/${month}/${day}/')

如您所见,我尝试使用yearmonthday 对数据进行分区。尽管还有一个小时文件夹,但我对此不感兴趣。该命令执行得很好,它也创建了表。但是当我查询表时:

SELECT * FROM analytics.logs LIMIT 10;

它返回空。但是,如果我创建没有 PARTITIONED 部分的同一张表,我可以看到记录。有人可以帮我理解我做错了什么吗?

[更新]

我简化了文件夹结构以查看它是否有效。它不是。

$ aws s3 ls s3://bucket-name/test --recursive
2023-01-24 07:03:30          0 test/
2023-01-24 07:03:59          0 test/2022/
2023-01-24 07:11:06      13889 test/2022/Log-1-2022-12-01-00-00-11-255f8d74-5417-42a0-8c09-97282a626903
2023-01-24 07:11:05       8208 test/2022/Log-1-2022-12-01-00-05-15-c34eda24-36d8-484c-b7b6-4861c297d857

CREATE EXTERNAL TABLE `log_2`(
  `id` string, 
  ...
  `type` tinyint)
PARTITIONED BY ( 
  `year` bigint COMMENT '')
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://bucket-name/test'
TBLPROPERTIES (
  'classification'='csv', 
  'partition.enable'='true', 
  'partition.year.range'='2021,2023', 
  'partition.year.type'='integer', 
  'storage.location.template'='s3://bucket-name/test/${year}/')

以下查询仍然没有返回任何内容:

SELECT * FROM "analytics"."log_2" where year = 2022 limit 10;

【问题讨论】:

  • 您是否尝试运行MSCK REPAIR TABLE - Amazon Athena 来识别现有分区?
  • 如果我错了请纠正我,但在使用分区投影时,Athena 不需要读取/重新加载分区。我的意思是这就是分区投影的全部卖点。
  • 啊。好的,我还没有尝试过以这种方式使用分区。

标签: amazon-web-services amazon-athena


【解决方案1】:

您的数据类型不匹配。按年分区是 bigint,分区投影是整数。使两个整数。

"projection.enabled" = "true",
"projection.datehour.type" = "date",
"projection.datehour.format" = "yyyy/MM/dd/HH",
"projection.datehour.range" = "2021/01/01/00,NOW",
"projection.datehour.interval" = "1",
"projection.datehour.interval.unit" = "HOURS",

将分区词更改为投影。

【讨论】:

  • 嗨,西蒙,感谢您指出该问题。虽然你是对的,需要纠正,但它没有帮助。谢谢你。
  • 这是我们表格中的示例 'projection.dt.format'='yyyy-MM-dd', 'projection.dt.interval'='1', 'projection.dt.interval.unit'='DAYS', ' projection.dt.range'='2022-10-02,NOW', 'projection.dt.type'='date', 'projection.enabled'='true',
  • 将分区更改为投影
【解决方案2】:

对于可能犯我错误的任何其他人,问题是我在 TBLPROPERTIES 部分(错误地)使用了 partition。虽然它应该是projection

为您提供一个工作示例:

CREATE EXTERNAL TABLE `log_2`(
  id string, 
  ...
  type tinyint)
PARTITIONED BY ( 
  `year` bigint COMMENT '')
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  's3://bucket-name/test'
TBLPROPERTIES (
  'classification'='csv', 
  'projection.enable'='true', 
  'projection.year.range'='2021,2023', 
  'projection.year.type'='integer', 
  'storage.location.template'='s3://bucket-name/test/${year}/')

【讨论】:

    猜你喜欢
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多