使用 AWS Glue 中的 CSV 数据 - Amazon Athena

使用 AWS Glue 中的 CSV 数据

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

处理引号中包含的 CSV 数据

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

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

要在 Athena 中对使用具有引号值的 CSV 文件创建的表运行查询,必须修改 AWS Glue 中的表属性以使用 OpenCSVSerDe。有关 OpenCSV SerDe 的更多信息,请参阅 用于处理 CSV 的 Open CSV SerDe

要在 AWS Glue 控制台中编辑表属性
  1. 在 AWS 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. 选择保存

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

也可以通过编程方式更新 AWS Glue 表属性。使用 AWS Glue UpdateTable API 操作或 update-table AWS 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 查询结果中。实现此操作的一种方法是使用 AWS Glue 任务,它执行提取、转换和加载 (ETL) 工作。您可以使用 PySpark Python 方言的扩展语言在 AWS Glue 中编写脚本。有关更多信息,请参阅《AWS Glue 开发人员指南》中的在 AWS Glue 中编写任务

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