在混合数据 S3 存储桶上使用 Athena 搜索

问题描述

美好的一天!

问题是:有谁知道如何在不只包含 JSON 的 S3 存储桶上使用 Athena 查询 JSON 数据?

我一直在尝试在包含此类对象的存储桶中创建 Athena 搜索

S3Bucket
├── AFolder
│   ├── ExternalServiceID-1
│   │   ├── file-that-is-JSON
│   │   └── file-that-is-zip
│   ├── ExternalServiceID-2
│   │   ├── file-that-is-JSON
│   │   └── file-that-is-zip
│   └── ...

我想做的 Athena 搜索是在一个尝试投影 files-that-is-JSON 的一些简单属性的表上进行的。

表格是这样创建的(更多的属性,但它们都是相同的结构),请注意最后的声明,该声明是通过文档应该做什么来忽略非json数据:

CREATE EXTERNAL TABLE IF NOT EXISTS mytable(
         person struct <
            firstname: string,lastname: string,>
)
ROW FORMAT  serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties ( 'ignore.malformed.json'='true' )

但是,当运行带有任何 WHERE 子句的查询时,我收到错误 HIVE_BAD_DATA: Error parsing field value for field 1: Data is not JSONObject but java.lang.String with value H,这表明表未正确创建。此类查询一个示例是:

SELECT *
FROM "workspace"."mytable"
WHERE person.firstname.value='Max'
AND person.lastName.value='Mustermann' limit 10; 

如果我不像我在创建表时描述的那样使用结构体,那么我不会有错误,但我自然会失去查询特定值的能力。

解决方法

您的存储格式与 Amazon Athena 不兼容。

与一张表相关的所有文件都需要在一个目录中。

因此,该路径中的所有文件都需要具有相同的格式。

如果您要查询显示的多个 JSON 文件,其中每个文件都位于包含 zip 文件的目录中,则无法使用 Amazon Athena。