雅典娜 return 中的分区 json 查询没有数据

partitioned json queries in athena return no data

一段时间以来我一直在尝试设置 athena 数据库,我似乎正确设置了数据库,但是当我查询它时 returns 没有数据。我查询的数据是

结构的一系列分区S3文件
"S3://bucket_name/data1=partition_1/data2=partition_2/data3=partition_3/data4=partition_4/file.json"

一个分区可以有多个file.json例如

"S3://bucket_name/data1=partition_1/data2=partition_2/data3=partition_3/data4=partition_4/file1.json"
"S3://bucket_name/data1=partition_1/data2=partition_2/data3=partition_3/data4=partition_4/file2.json"

下面是我运行的查询以及创建命令和存储的数据

CREATE EXTERNAL TABLE bench_logs (
  id string,
  filename string,
  data struct<transmit_start: timestamp, 
                     transmit_end:timestamp, 
                     transfer_start:timestamp,
                     transfer_end:timestamp,
                     processing_start:timestamp, 
                     processing_end:timestamp>
  )
PARTITIONED BY ( 
  partition_1 string, 
  partition_2 string, 
  partition_3 date, 
  partition_4 string
  )
ROW FORMAT SERDE 
  'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES ('ignore.malformed.json' = 'true')
LOCATION
  's3://benchmark-files/complete/'
TBLPROPERTIES (
  'classification'='json',
  'storage.location.template'='s3://iceqube-benchmark-files/complete/partition_1=${partition_1}/partition_2=${partition_2}/partition_3=${partition_3}/partition_4=${partition_4}/')

table 被查询为:

SELECT id FROM "benchmark"."bench_logs"
WHERE partition_1='foo'
AND partition_2='bar' 
AND partition_3=cast('1970-01-01' as date) 
AND partition_4='09:30:00';

查询 运行 正确,但除了 headers.

列,我看不到任何数据

如果还需要数据,请提供,我已经被困了好几天了,根本无法理解它。提前致谢。

在您可以查询分区之前 table you must add the partitions to it. This can be done with ALTER TABLE bench_logs ADD PARTITION …, or by using partition projection, as well as other ways.

此外,您似乎混淆了 Hive 分区方案的键和值:如果分区键称为 partition_1,则 S3 URI 应为 …/partition_1=data_1/…不是 …/data_1=partition_1/….

回来以防其他人遇到这些问题。

我听从了 Theo 的建议,但仍然无法查询。

原来问题是分区的值包含“:”,因为这通常是 S3 中的受限字符,但当我以编程方式编写时,它被允许通过。

对此的完整解释得到更好的回答here