

# 使用 Amazon Glue 中的 CSV 数据
<a name="schema-csv"></a>

本页介绍了如何使用 Amazon Glue 从在每列数据值前后加引号的 CSV 文件或包含标题值的 CSV 文件创建架构。

## 处理引号中包含的 CSV 数据
<a name="schema-csv-quotes"></a>

假设 CSV 文件的数据字段用双引号括起来，如下例所示。

```
"John","Doe","123-555-1231","John said \"hello\""
"Jane","Doe","123-555-9876","Jane said \"hello\""
```

要在 Athena 中对使用具有引号值的 CSV 文件创建的表运行查询，必须修改 Amazon Glue 中的表属性以使用 OpenCSVSerDe。有关 OpenCSV SerDe 的更多信息，请参阅 [用于处理 CSV 的 Open CSV SerDe](csv-serde.md)。

**要在 Amazon Glue 控制台中编辑表属性**

1. 在 Amazon Glue 控制台中，选择导航窗格中的 **Tables**（表）。

1. 选择您要编辑的表的链接，然后依次选择 **Action**（操作）、**Edit table**（编辑表）。

1. 在 **Edit table**（编辑表）页面上，进行以下更改：
   + 对于 **Serialization lib**（序列化库），输入 `org.apache.hadoop.hive.serde2.OpenCSVSerde`。
   + 对于 **Serde parameters**（SerDe 参数），为键 `escapeChar`、`quoteChar` 和 `separatorChar` 输入以下值：
     + 对于 `escapeChar`，输入一个反斜杠 (**\$1**)。
     + 对于 `quoteChar`，输入一个双引号 (**"**)。
     + 对于 `separatorChar`，输入一个逗号 (**,**)。

1. 选择**保存**。

有关更多信息，请参阅《Amazon Glue 开发人员指南**》中的[查看和编辑表详细信息](https://docs.amazonaws.cn/glue/latest/dg/console-tables.html#console-tables-details)。

也可以通过编程方式更新 Amazon Glue 表属性。使用 Amazon Glue [UpdateTable](https://docs.amazonaws.cn/glue/latest/webapi/API_UpdateTable.html) API 操作或 [update-table](https://docs.amazonaws.cn/cli/latest/reference/glue/update-table.html) Amazon CLI 命令来修改表定义中的 `SerDeInfo` 块，如以下示例 JSON 所示。

```
"SerDeInfo": {
   "name": "",
   "serializationLib": "org.apache.hadoop.hive.serde2.OpenCSVSerde",
   "parameters": {
      "separatorChar": ","
      "quoteChar": "\""
      "escapeChar": "\\"
      }
},
```

## 处理具有标题的 CSV 文件
<a name="schema-csv-headers"></a>

当您在 Athena 中使用 `CREATE TABLE` 语句定义一个表时，可以使用 `skip.header.line.count` 表属性以忽略 CSV 数据中的标题，如下例所示。

```
...
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/csvdata_folder/';
TBLPROPERTIES ("skip.header.line.count"="1")
```

或者，您可以事先删除 CSV 标题，以便不将标题信息包含在 Athena 查询结果中。实现此操作的一种方法是使用 Amazon Glue 任务，它执行提取、转换和加载 (ETL) 工作。您可以使用 PySpark Python 方言的扩展语言在 Amazon Glue 中编写脚本。有关更多信息，请参阅《Amazon Glue 开发人员指南》中的[在 Amazon Glue 中编写任务](https://docs.amazonaws.cn/glue/latest/dg/author-job-glue.html)。

以下示例显示 Amazon Glue 脚本中的一个函数，它使用 `from_options` 写出动态帧，并将 `writeHeader` 格式选项设置为 false，从而删除标题信息：

```
glueContext.write_dynamic_frame.from_options(frame = applymapping1, connection_type = "s3", connection_options = {"path": "s3://amzn-s3-demo-bucket/MYTABLEDATA/"}, format = "csv", format_options = {"writeHeader": False}, transformation_ctx = "datasink2")
```