使用 Amazon Glue 中的 CSV 数据 - Amazon Athena
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

使用 Amazon Glue 中的 CSV 数据

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

处理引号中包含的 CSV 数据

假设 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

要在 Amazon Glue 控制台中编辑表属性
  1. 在 Amazon Glue 控制台中,选择导航窗格中的 Tables(表)。

  2. 选择您要编辑的表的链接,然后依次选择 Action(操作)、Edit table(编辑表)。

  3. Edit table(编辑表)页面上,进行以下更改:

    • 对于 Serialization lib(序列化库),输入 org.apache.hadoop.hive.serde2.OpenCSVSerde

    • 对于 Serde parameters(SerDe 参数),为键 escapeCharquoteCharseparatorChar 输入以下值:

      • 对于 escapeChar,输入一个反斜杠 (\)。

      • 对于 quoteChar,输入一个双引号 (")。

      • 对于 separatorChar,输入一个逗号 (,)。

  4. 选择保存

有关更多信息,请参阅《Amazon Glue 开发人员指南》中的查看和编辑表详细信息

也可以通过编程方式更新 Amazon Glue 表属性。使用 Amazon Glue UpdateTable API 操作或 update-table Amazon CLI 命令来修改表定义中的 SerDeInfo 块,如以下示例 JSON 所示。

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

处理具有标题的 CSV 文件

当您在 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 中编写任务

以下示例显示 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")