【问题标题】:Using Athena searches on mixed data S3 Buckets使用 Athena 搜索混合数据 S3 存储桶
【发布时间】:2021-07-10 08:21:57
【问题描述】:

美好的一天!

问题是:有谁知道如何在不只包含 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; 

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

【问题讨论】:

    标签: json amazon-web-services amazon-s3 amazon-athena


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 那么问题:我之前做过其他查询,这些查询将数据分布在不同的文件夹中。另外,如果是这种情况,为什么在我简化表格的结构时它会起作用?也许您可以告诉我在哪里说明了数据的结构方式,因为我正在重组创建数据和此信息的服务可能会影响新设计。谢谢!
    • Amazon Athena 读取指定目录中的所有文件,包括子目录。这些路径中的任何对象都需要具有相同的格式。如果你设法让它以不同的方式工作,那么你可能比我更了解如何去做。
    猜你喜欢
    • 2017-06-11
    • 2021-07-26
    • 1970-01-01
    • 2019-08-26
    • 2020-01-12
    • 2021-12-17
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多