【问题标题】:How to use multiple file with different structure in Athena如何在 Athena 中使用具有不同结构的多个文件
【发布时间】:2017-04-25 09:19:39
【问题描述】:

我在 s3 存储桶目录中有多个文件(所有文件都在同一个目录中)。所有文件都有不同的结构,例如如果一个文件有 4 列,那么第二个文件有 6 个不同的列。 如何使用这些文件创建 Athena 表?

【问题讨论】:

  • 这取决于您的文件格式,SerDe 是否可以适应读取它。你能解释一下你的文件格式吗,例如JSON、CSV、ORC?
  • 我使用的是json文件
  • 请分享每个文件的样本(比如说 3 行)
  • first.json: {"MPR-UT":"47867739","MPR-Prd":"EEE","MPR-Process":"LOAD","MPR-TimeStamp":" 2017-04-11 16:13:23"} {"MPR-UT":"78676765","MPR-Prd":"ABC","MPR-Process":"LOAD","MPR-TimeStamp":" 2017-04-11 16:13:24"} {"MPR-UT":"87420087","MPR-Prd":"XYZI","MPR-Process":"LOAD","MPR-TimeStamp":" 2017-04-11 16:03:25"} second.json: {"CPR-BatchID":"PT5_20170407","CPR-Prd":"X","CPR-UT":"47867739","CPR- CoverageStatus":"N"} {"CPR-BatchID":"PT5_20170406","CPR-Prdt":"X","CPR-UT":"78676765","CPR-CoverageStatus":"N"} {" CPR-BatchID":"PT5_20170405","CPR-Prd":"X","CPR-UT":"87420087","CPR-CoverageStatus":"N"}

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


【解决方案1】:

我相信 AWS Athena / Presto 目前无法做到这一点(请告诉我其他情况!)。

Athena 表的外部位置(始终为 EXTERNAL TABLE)必须是目录。

s3://mybucket/folder/table/file_as3://mybucket/folder/table/file_b结构不同会导致SCHEMA_MISMATCH

Athena 需要格式为 s3://mybucket/folder/table1/s3://mybucket/folder/table2/ 的表格。

更新

来自与 AWS 支持的对话:

对于第一个路径要求,您必须将每个表的文件明智地移动到单独的文件夹中,否则 Athena 将始终认为所有文件都用于单个表。

【讨论】:

    【解决方案2】:

    如果您的文件包含不同的数据,您需要将它们定义为不同的外部表(每个都有自己的CREATE EXTERNAL TABLE 语句)。

    然后您可以通过 JOIN 跨多个表运行查询。

    【讨论】:

      【解决方案3】:

      您可以在 Athena 中创建指向特定文件的表。

      您所做的是创建一个具有特殊输入格式的表格:

      STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat'
      

      然后不是将表的LOCATION 指向实际文件,而是将其指向带有单个symlink.txt 文件的前缀(或将每个分区指向带有单个symlink.txt 的前缀)。在 symlink.txt 文件中,添加要包含在表中的文件的 S3 URI,每行一个。

      我所知道的有关此功能的唯一文档是S3 Inventory documentation for integrating with Athena

      您还可以在 Stackoverflow 回复中找到完整示例:https://stackoverflow.com/a/55069330/1109

      【讨论】:

        【解决方案4】:

        以下场景。

        data1.json:

        {"a":"data1","b":"data2"}
        

        data2.json

        {"c":"data3","d":"data4"}
        

        您可以创建以下表格:

        create external table data1 (
          a string,
          b string
        )
        ROW FORMAT  serde 'org.openx.data.jsonserde.JsonSerDe'
        LOCATION 's3://bucket/x';
        create external table data2 (
          c string,
          d string
        )
        ROW FORMAT  serde 'org.openx.data.jsonserde.JsonSerDe'
        LOCATION 's3://bucket/x';
        

        现在您可以查询通过单独表定义的单独文件。您唯一需要注意的是,不同的文件类型会在您的结果中生成空条目。

        select * from data1 where a is not null;
        select * from data2 where c is not null;
        

        【讨论】:

        • 如果 data1.json 和 data2.json 都在同一个目录中(比如 s3://bucket/dir/)怎么办?我将如何在创建表查询中提及位置。它是有效的场景还是两个文件都必须存在于不同的目录中?
        • 从技术上讲,Athena 可以遍历目录中的所有文件,但它会为不匹配的文件条目创建空行。可以过滤查询中的空行。另一方面,每个文件类型都有一个目录会更干净,但这并不总是可行的。因此,仅在 1 个目录上创建 2 个表是下一个最好的事情。您可以使用上面带有“LOCATION 's3://bucket/dir'”的语句为一个目录创建任意数量的表。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多