本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
定义和管理分类器
分类器读取数据存储中的数据。如果它可识别数据的格式,它会生成一个架构。分类器还会返回确定性数字,以指示格式识别的确定程度。
Amazon Glue 提供一组内置分类器,但您也可以创建自定义分类符。Amazon Glue 首先按照您在爬网程序定义中指定的顺序调用自定义分类符。根据从自定义分类符返回的结果,Amazon Glue 还可能调用内置分类符。如果分类器在处理期间返回 certainty=1.0
,则表明 100% 确定它可以创建正确的架构。然后,Amazon Glue 使用该分类器的输出。
如果没有分类器返回 certainty=1.0
,则 Amazon Glue 使用具有最高确定性的分类器的输出。如果没有分类器返回大于 0.0
的确定性,Amazon Glue 会返回 UNKNOWN
的默认分类字符串。
何时使用分类器?
在网络爬取数据存储以定义 Amazon Glue Data Catalog 中的元数据表时,您可以使用分类器。您可以为您的爬网程序设置一组有序的分类器。当爬网程序调用分类器时,分类器会确定数据是否可被识别。如果分类器无法识别数据或不是 100% 确定,则爬网程序会调用列表中的下一个分类器来确定它能否识别数据。
有关使用 Amazon Glue 控制台创建分类器的更多信息,请参阅使用 Amazon Glue 控制台创建分类器。
自定义分类器
分类器的输出包含一个指示文件的分类或格式 (例如 json
) 以及文件的架构的字符串。对于自定义分类器,您根据分类器类型定义用于创建架构的逻辑。分类器类型包括根据 grok 模式、XML 标签和 JSON 路径定义架构。
如果您更改一个分类器定义,则之前使用该分类器爬网的任何数据均不会重新分类。爬网程序将跟踪之前爬网的数据。新数据将用更新的分类器来分类,这可能会产生更新的架构。如果数据架构发生了变化,请更新分类器来考虑爬网程序运行时的任何架构更改。要对数据重新分类以更正错误的分类器,请用更新的分类器创建新爬网程序。
有关在 Amazon Glue 中创建自定义分类器的更多信息,请参阅为不同的数据格式编写自定义分类器。
注意
如果您的数据格式可被由某个内置分类器识别,则不需要创建自定义分类器。
内置分类器
Amazon Glue 为各种格式(包括 JSON、CSV、Web 日志和许多数据库系统)提供内置分类器。
如果 Amazon Glue 找不到符合 100% 确定性的输入数据格式的自定义分类器,它会按照下表中所示的顺序调用内置分类器。内置分类器返回结果以指示格式是否匹配 (certainty=1.0
) 或不匹配 (certainty=0.0
)。第一个具有 certainty=1.0
的分类器为您的数据目录中的元数据表提供分类字符串和架构。
分类器类型 | 分类字符串 | 注意 |
---|---|---|
Apache Avro | avro |
读取文件开头处的架构以确定格式。 |
Apache ORC | orc |
读取文件元数据以确定格式。 |
Apache Parquet | parquet |
读取文件结尾处的架构以确定格式。 |
JSON | json |
读取文件的开头以确定格式。 |
二进制 JSON | bson |
读取文件的开头以确定格式。 |
XML | xml |
读取文件的开头以确定格式。Amazon 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 文件内容,以确定 Amazon Glue 表的架构。此分类器会检查以下分隔符:
逗号 (,)
竖线 (|)
制表符 (\t)
分号 (;)
Ctrl-A (\u0001)
Ctrl-A 是
Start Of Heading
的 Unicode 控制字符。
要被分类为 CSV,表架构必须至少有两列和两行数据。CSV 分类器使用许多探试程序来确定给定中是否存在某一标头。如果分类器无法根据第一行数据确定标头,列标题将显示为 col1
、col2
、col3
,以此类推。内置的 CSV 分类器确定是否通过评估文件的以下特性来推断标头:
潜在标头中的每列均分析为 STRING 数据类型。
除了最后一列外,潜在标头中的每列的内容均少于 150 个字符。要允许尾部的分隔符,在整个文件中最后一列均可为空。
潜在标头中的每列都必须满足列名称的 Amazon Glue
regex
要求。标题行必须与数据行存在足够差别。为确定这一点,必须将一行或多行分析为 STRING 之外的类型。如果所有列均为 STRING 类型,则第一行数据与后续行差别不够大,无法用作标头。
注意
如果内置的 CSV 分类器未创建您需要的 Amazon Glue 表,您可能能够使用以下一种方法:
更改数据目录中的列名称,将
SchemaChangePolicy
设置为 LOG,为未来的爬网程序运行将分区输出配置设置为InheritFromTable
。创建自定义 grok 分类器,以分析数据并按您所需来分配列。
内置的 CSV 分类器会创建表,同时引用
LazySimpleSerDe
作为序列化库,这是进行类型推断的极好选择。但是,如果 CSV 数据包含带引号的字符串,请编辑表定义并将 SerDe 库更改为OpenCSVSerDe
。将任何推断类型调整为 STRING,将SchemaChangePolicy
设置为 LOG,为未来的爬网程序运行将分区输出配置设置为InheritFromTable
。有关 SerDe 库的更多信息,请参阅 Amazon Athena 用户指南中的 SerDe 参考。