向爬网程序中添加分类器 - AWS Glue
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

向爬网程序中添加分类器

分类器读取数据存储中的数据。如果它可识别数据的格式,它会生成一个架构。分类器还会返回确定性数字,以指示格式识别的确定程度。

AWS Glue 提供一组内置分类器,但您也可以创建自定义分类符。AWS Glue 首先按照您在爬网程序定义中指定的顺序调用自定义分类符。根据从自定义分类符返回的结果,AWS Glue 还可能调用内置分类符。如果分类器在处理期间返回 certainty=1.0,则表明 100% 确定它可以创建正确的架构。然后,AWS Glue 使用该分类器的输出。

如果没有分类器返回 certainty=1.0,则 AWS Glue 使用具有最高确定性的分类器的输出。如果没有分类器返回大于 0.0 的确定性,AWS Glue 会返回 UNKNOWN 的默认分类字符串。

何时使用分类器?

在网络爬取数据存储以定义 AWS Glue 数据目录 中的元数据表时,您可以使用分类器。您可以为您的爬网程序设置一组有序的分类器。当爬网程序调用分类器时,分类器会确定数据是否可被识别。如果分类器无法识别数据或不是 100% 确定,则爬网程序会调用列表中的下一个分类器来确定它能否识别数据。

有关使用 AWS Glue 控制台创建分类器的更多信息,请参阅在 AWS Glue 控制台上使用分类器

自定义分类器

分类器的输出包含一个指示文件的分类或格式 (例如 json) 以及文件的架构的字符串。对于自定义分类器,您根据分类器类型定义用于创建架构的逻辑。分类器类型包括根据 grok 模式、XML 标签和 JSON 路径定义架构。

如果您更改一个分类器定义,则之前使用该分类器爬网的任何数据均不会重新分类。爬网程序将跟踪之前爬网的数据。新数据将用更新的分类器来分类,这可能会产生更新的架构。如果数据架构发生了变化,请更新分类器来考虑爬网程序运行时的任何架构更改。要对数据重新分类以更正错误的分类器,请用更新的分类器创建新爬网程序。

有关在 AWS Glue 中创建自定义分类器的更多信息,请参阅编写自定义分类器

注意

如果您的数据格式可被由某个内置分类器识别,则不需要创建自定义分类器。

AWS Glue 中的内置分类器

AWS Glue 为各种格式(包括 JSON、CSV、Web 日志和许多数据库系统)提供内置分类器。

如果 AWS Glue 找不到符合 100% 确定性的输入数据格式的自定义分类器,它会按照下表中所示的顺序调用内置分类器。内置分类器返回结果以指示格式是否匹配 (certainty=1.0) 或不匹配 (certainty=0.0)。第一个具有 certainty=1.0 的分类器为您的 Data Catalog 中的元数据表提供分类字符串和架构。

分类器类型 分类字符串 备注
Apache Avro avro 读取文件开头处的架构以确定格式。
Apache ORC orc 读取文件元数据以确定格式。
Apache Parquet parquet 读取文件结尾处的架构以确定格式。
JSON json 读取文件的开头以确定格式。
二进制 JSON bson 读取文件的开头以确定格式。
XML xml 读取文件的开头以确定格式。AWS Glue 根据文档中的 XML 标记确定表架构。

有关创建自定义 XML 分类器以指定文档中的行的信息,请参阅编写 XML 自定义分类器

Amazon Ion ion 读取文件的开头以确定格式。
组合 Apache 日志 combined_apache 通过 grok 模式确定日志格式。
Apache 日志 apache 通过 grok 模式确定日志格式。
Linux 内核日志 linux_kernel 通过 grok 模式确定日志格式。
Microsoft 日志 microsoft_log 通过 grok 模式确定日志格式。
Ruby 日志 ruby_logger 读取文件的开头以确定格式。
Squid 3.x 日志 squid 读取文件的开头以确定格式。
Redis 监控日志 redismonlog 读取文件的开头以确定格式。
Redis 日志 redislog 读取文件的开头以确定格式。
CSV csv 检查以下分隔符:逗号 (,)、竖线 (|)、制表符 (\t)、分号 (;) 和 Ctrl-A (\u0001)。Ctrl-A 是 Start Of Heading 的 Unicode 控制字符。
Amazon Redshift redshift 使用 JDBC 连接导入元数据。
MySQL mysql 使用 JDBC 连接导入元数据。
PostgreSQL postgresql 使用 JDBC 连接导入元数据。
Oracle 数据库 oracle 使用 JDBC 连接导入元数据。
Microsoft SQL Server sqlserver 使用 JDBC 连接导入元数据。
Amazon DynamoDB dynamodb 从 DynamoDB 表中读取数据。

以下压缩格式的文件可以分类:

  • ZIP(在只包含单个文件的存档操作中支持此格式)。请注意,Zip 格式在其他服务中不太受支持(由于存档)。

  • BZIP

  • GZIP

  • LZ4

  • Snappy(支持标准和 Hadoop 本机 Snappy 格式)

内置的 CSV 分类器

内置的 CSV 分类器可分析 CSV 文件内容,以确定 AWS Glue 表的架构。此分类器会检查以下分隔符:

  • 逗号 (,)

  • 竖线 (|)

  • 制表符 (\t)

  • 分号 (;)

  • Ctrl-A (\u0001)

    Ctrl-A 是 Start Of Heading 的 Unicode 控制字符。

要被分类为 CSV,表架构必须至少有两列和两行数据。CSV 分类器使用许多探试程序来确定给定中是否存在某一标头。如果分类器无法根据第一行数据确定标头,列标题将显示为 col1col2col3,以此类推。内置的 CSV 分类器确定是否通过评估文件的以下特性来推断标头:

  • 潜在标头中的每列均分析为 STRING 数据类型。

  • 除了最后一列外,潜在标头中的每列的内容均少于 150 个字符。要允许尾部的分隔符,在整个文件中最后一列均可为空。

  • 潜在标头中的每列都必须满足列名称的 AWS Glue regex 要求。

  • 标题行必须与数据行存在足够差别。为确定这一点,必须将一行或多行分析为 STRING 之外的类型。如果所有列均为 STRING 类型,则第一行数据与后续行差别不够大,无法用作标头。

注意

如果内置的 CSV 分类器未创建您需要的 AWS Glue 表,您可能能够使用以下一种方法:

  • 更改 Data Catalog 中的列名称,将 SchemaChangePolicy 设置为 LOG,为未来的爬网程序运行将分区输出配置设置为 InheritFromTable

  • 创建自定义 grok 分类器,以分析数据并按您所需来分配列。

  • 内置的 CSV 分类器会创建表,同时引用 LazySimpleSerDe 作为序列化库,这是进行类型推断的极好选择。但是,如果 CSV 数据包含带引号的字符串,请编辑表定义并将 SerDe 库更改为 OpenCSVSerDe。将任何推断类型调整为 STRING,将 SchemaChangePolicy 设置为 LOG,为未来的爬网程序运行将分区输出配置设置为 InheritFromTable。有关 SerDe 库的更多信息,请参阅 Amazon Athena 用户指南中的 SerDe 参考