问题描述
美好的一天!
问题是:有谁知道如何在不只包含 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。