温馨提示:本文翻译自stackoverflow.com,查看原文请点击:aws glue - How to access data in subdirectories for partitioned Athena table
aws-glue aws-glue-data-catalog

aws glue - 如何访问分区的雅典娜表的子目录中的数据

发布于 2020-03-27 12:06:55

我每天都有一个带有分区的Athena表,其中实际文件按小时在“子目录”中,如下所示:

s3://my-bucket/data/2019/06/27/00/00001.json
s3://my-bucket/data/2019/06/27/00/00002.json
s3://my-bucket/data/2019/06/27/01/00001.json
s3://my-bucket/data/2019/06/27/01/00002.json

Athena可以毫无问题地查询该表并找到我的数据,但是在使用AWS Glue时,它似乎无法找到该数据。

ALTER TABLE mytable ADD 
PARTITION (year=2019, month=06, day=27) LOCATION 's3://my-bucket/data/2019/06/27/01';

select day, count(*)
from mytable
group by day;

day .   count
27 .    145431

我已经尝试过将分区的位置更改为以斜杠(s3://my-bucket/data/2019/06/27/01/结尾,但这无济于事。

以下是Glue中的分区属性。我希望storedAsSubDirectories设置可以告诉它迭代子目录,但是事实并非如此:

{
    "StorageDescriptor": {
        "cols": {
            "FieldSchema": [
                {
                    "name": "userid",
                    "type": "string",
                    "comment": ""
                },
                {
                    "name": "labels",
                    "type": "array<string>",
                    "comment": ""
                }
            ]
        },
        "location": "s3://my-bucket/data/2019/06/27/01/",
        "inputFormat": "org.apache.hadoop.mapred.TextInputFormat",
        "outputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
        "compressed": "false",
        "numBuckets": "0",
        "SerDeInfo": {
            "name": "JsonSerDe",
            "serializationLib": "org.openx.data.jsonserde.JsonSerDe",
            "parameters": {
                "serialization.format": "1"
            }
        },
        "bucketCols": [],
        "sortCols": [],
        "parameters": {},
        "SkewedInfo": {
            "skewedColNames": [],
            "skewedColValues": [],
            "skewedColValueLocationMaps": {}
        },
        "storedAsSubDirectories": "true"
    },
    "parameters": {}
}

当Glue在相同的分区/表上运行时,它将发现0行。

但是,如果所有数据文件都出现在分区的根目录中(即s3://my-bucket/data/2019/06/27/00001.json),那么Athena和Glue都可以找到数据。

Glue无法找到数据文件有某些原因吗?我不希望每个小时都创建一个分区,因为这意味着每年8700个分区(而Athena的每个表限制为20,000个分区)。

查看更多

查看更多

提问者
EdwardB
被浏览
51
EdwardB 2019-07-03 23:52

显然,create_dynamic_frame上有一个未记录的“递归”附加选项: additional_options = {"recurse": True}

例:

athena_datasource = glueContext.create_dynamic_frame.from_catalog(database = target_database, table_name = target_table, push_down_predicate = "(year=='2019' and month=='06' and day=='27')", transformation_ctx = "athena_datasource", additional_options = {"recurse": True})

我刚刚使用此选项测试了我的Glue作业,可以确认它现在可以找到所有s3文件。