

# 定义和管理分类器
<a name="add-classifier"></a>

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

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

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

## 何时使用分类器？
<a name="classifier-when-used"></a>

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

 有关使用 AWS Glue 控制台创建分类器的更多信息，请参阅[使用 AWS Glue 控制台创建分类器](console-classifiers.md)。

## 自定义分类器
<a name="classifier-defining"></a>

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

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

有关在 AWS Glue 中创建自定义分类器的更多信息，请参阅[为不同的数据格式编写自定义分类器](custom-classifier.md)。

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

## 内置分类器
<a name="classifier-built-in"></a>

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

如果 AWS 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 | 读取文件的开头以确定格式。AWS Glue 根据文档中的 XML 标记确定表架构。 有关创建自定义 XML 分类器以指定文档中的行的信息，请参阅[编写 XML 自定义分类器](custom-classifier.md#custom-classifier-xml)。 | 
| Amazon Ion | ion | 读取文件的开头以确定格式。 | 
| 组合 Apache 日志 | combined\$1apache | 通过 grok 模式确定日志格式。 | 
| Apache 日志 | apache | 通过 grok 模式确定日志格式。 | 
| Linux 内核日志 | linux\$1kernel | 通过 grok 模式确定日志格式。 | 
| Microsoft 日志 | microsoft\$1log | 通过 grok 模式确定日志格式。 | 
| Ruby 日志 | ruby\$1logger | 读取文件的开头以确定格式。 | 
| Squid 3.x 日志 | squid | 读取文件的开头以确定格式。 | 
| Redis 监控日志 | redismonlog | 读取文件的开头以确定格式。 | 
| Redis 日志 | redislog | 读取文件的开头以确定格式。 | 
| CSV | csv | 检查以下分隔符：逗号 (,)、竖线 (\$1)、制表符 (\$1t)、分号 (;) 和 Ctrl-A (\$1u0001)。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 分类器
<a name="classifier-builtin-rules"></a>

内置的 CSV 分类器可分析 CSV 文件内容，以确定 AWS Glue 表的架构。此分类器会检查以下分隔符：
+ 逗号 (,)
+ 竖线 (\$1)
+ 制表符 (\$1t)
+ 分号 (;)
+ Ctrl-A (\$1u0001)

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

要被分类为 CSV，表架构必须至少有两列和两行数据。CSV 分类器使用许多探试程序来确定给定中是否存在某一标头。如果分类器无法根据第一行数据确定标头，列标题将显示为 `col1`、`col2`、`col3`，以此类推。内置的 CSV 分类器确定是否通过评估文件的以下特性来推断标头：
+ 潜在标头中的每列均分析为 STRING 数据类型。
+ 除了最后一列外，潜在标头中的每列的内容均少于 150 个字符。要允许尾部的分隔符，在整个文件中最后一列均可为空。
+ 潜在标头中的每列都必须满足列名称的 AWS Glue `regex` 要求。
+ 标题行必须与数据行存在足够差别。为确定这一点，必须将一行或多行分析为 STRING 之外的类型。如果所有列均为 STRING 类型，则第一行数据与后续行差别不够大，无法用作标头。

**注意**  
如果内置的 CSV 分类器未创建您需要的 AWS Glue 表，您可能能够使用以下一种方法：  
更改数据目录中的列名称，将 `SchemaChangePolicy` 设置为 LOG，为未来的爬网程序运行将分区输出配置设置为 `InheritFromTable`。
创建自定义 grok 分类器，以分析数据并按您所需来分配列。
内置的 CSV 分类器会创建表，同时引用 `LazySimpleSerDe` 作为序列化库，这是进行类型推断的极好选择。但是，如果 CSV 数据包含带引号的字符串，请编辑表定义并将 SerDe 库更改为 `OpenCSVSerDe`。将任何推断类型调整为 STRING，将 `SchemaChangePolicy` 设置为 LOG，为未来的爬网程序运行将分区输出配置设置为 `InheritFromTable`。有关 SerDe 库的更多信息，请参阅 Amazon Athena 用户指南中的 [SerDe 参考](https://docs.aws.amazon.com/athena/latest/ug/serde-reference.html)。