AWS Glue 目录 API:不同结构的元数据中的参数字段

Posted

技术标签:

【中文标题】AWS Glue 目录 API:不同结构的元数据中的参数字段【英文标题】:AWS Glue Catalog API: Parameters field in metadata of different structures 【发布时间】:2019-09-26 13:12:13 【问题描述】:

AWS Glue 数据目录由不同的结构组成,例如 Database, Table, Partition, Column 等。还没有仔细查看它们中的每一个,但似乎Parameters 字段(键值对的映射数组)存在于所有这些字段中。我注意到,如果表是由 crawler 创建的,那么我们可以看到如下内容:


    "CrawlerSchemaDeserializerVersion": "1.0",
    "CrawlerSchemaSerializerVersion": "1.0",
    "UPDATED_BY_CRAWLER": "some-crawler-name",
    "averageRecordSize": "12",
    "classification": "parquet",
    "compressionType": "none",
    "objectCount": "123",
    "recordCount": "1234567",
    "sizeKey": "1234567890",
    "typeOfData": "file"

对于Table["Parameters"]Table["StorageDescriptor"]["Parameters"]。如果我们的表有分区,那么每个分区都有相同的字典,但 averageRecordSizeobjectCountrecordCountrecordCount 的值不同强>大小键。将它们相加后,我们最终得到与Table["Parameters"] 相同的值。所有这些都是有道理的,我猜这些值决定了我们想要按需或按计划重新运行爬虫的逻辑。

我没有使用爬虫,而是使用 boto3 和 airflow 手动管理多个 AWS Glue 目录。例如,我可以将目录 12345db_1.table_1 中的分区定义复制到目录6789 中的db_2.table_2 中,或者在table_1 中定义其他元参数。但是,这个 Parameters 字段对我来说仍然是一个谜,我找不到任何与它相关的文档。

它看起来像一些键,例如recordCount,保留供 AWS Glue 内部使用(尽管可以手动定义)。

    其他服务(尤其是 Athena)是否也使用它们? 在哪里可以找到此类键及其含义的列表,以免我的键干扰?

    文档提到这些键值对定义了与表关联的属性和一些限制:

      每个密钥都是一个密钥字符串,长度不少于 1 或超过 255 个字节,与单行字符串模式匹配。 每个值都是一个 UTF-8 字符串,长度不超过 512000 字节。

    Parameters 字段可以包含多少个键有任何限制吗?当您查询数据时,这些键值对的数量是否会影响性能?

    保持Parameters 字段与表、分区及其存储描述符同步是多么重要

【问题讨论】:

【参考方案1】:
    是的,例如Redshift 频谱使用它来优化查询计划 - https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_TABLE.html#r_CREATE_EXTERNAL_TABLE-parameters

    很遗憾,没有完整的文档解释所有 TBLPROPERTIES。

    但您可能在上面的 Rdshift Spectrum 链接中发现很少。 您可以在 athena 中运行以下 sql 查询以获取用于给定表的 TBLPROPERTIES:SHOW TBLPROPERTIES <table_name> 您也可以查看 HIVE 文档,因为 presto 是基于 HIVE - https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-ManagedandExternalTables 的。请注意,并非所有属性都适用于 Athena。

    我认为它不会对性能产生负面影响。内部属性通常用于某些活动,例如crawled_by 被 Glue 使用,numRows 被 Athena/Redshift 使用,has_encrypted_data 用于检查 s3 数据是否加密等等。

    保持同步很重要,因为这些属性用于有效地管理表和对表的查询。某些属性,例如skip.header.line.count=2 可以跳过前两行,不会被视为数据行。

【讨论】:

如果打算通过 Athena 中的 DDL 创建表。但是,要到达那里,我们首先手动创建了一个爬虫,然后在 Athena 中运行“生成表 DDL”并复制 DDL 以通过 Athena 中的 DDL 创建表......我假设我们不需要这些属性? “CrawlerSchemaDeserializerVersion”:“1.0”,“CrawlerSchemaSerializerVersion”:“1.0”,“UPDATED_BY_CRAWLER”:“some-crawler-name”,“averageRecordSize”:“12”,“UpdatedByJobRun”:“some-crawler-jobid”

以上是关于AWS Glue 目录 API:不同结构的元数据中的参数字段的主要内容,如果未能解决你的问题,请参考以下文章

控制台中的 AWS Glue 控制列顺序

如何以编程方式重命名 AWS Glue 目录中的列名

Apache Hudi在AWS Glue和AWS EMR上同步元数据的异同

Apache Hudi在AWS Glue和AWS EMR上同步元数据的异同

AWS Glue:如何处理具有不同架构的嵌套 JSON

AWS Glue 不检测分区并在目录中创建 1000 多个表