Amazon web services 如何确保AWS胶水爬虫I';我写的是使用OpenCSV SerDe而不是LazySimpleSerDe?

Amazon web services 如何确保AWS胶水爬虫I';我写的是使用OpenCSV SerDe而不是LazySimpleSerDe?,amazon-web-services,amazon-athena,aws-glue,Amazon Web Services,Amazon Athena,Aws Glue,上下文:我略读了一下,但对答案感到失望,原因有二: 我没有用Python写任何东西;事实上,我根本没有为此编写任何自定义脚本,因为我依赖的是一个而不是一个胶水脚本 答案没有我要求的那么完整,因为它只是指向某个库的链接 我希望利用AWS Glue将一些CSV接受到模式中,并使用Athena将CSV表转换为多个拼花格式的表,以用于ETL。我正在处理的数据中嵌入了引号,除了一条记录的值为: "blablabla","1","Freeman,Morgan","bla bla bla" 当Glue

上下文:我略读了一下,但对答案感到失望,原因有二:

  • 我没有用Python写任何东西;事实上,我根本没有为此编写任何自定义脚本,因为我依赖的是一个而不是一个胶水脚本
  • 答案没有我要求的那么完整,因为它只是指向某个库的链接

我希望利用AWS Glue将一些CSV接受到模式中,并使用Athena将CSV表转换为多个拼花格式的表,以用于ETL。我正在处理的数据中嵌入了引号,除了一条记录的值为:

"blablabla","1","Freeman,Morgan","bla bla bla"
当Glue遇到
“Freeman,Morgan”
一段数据时,它似乎被自己绊倒了

如果我使用标准的Glue crawler,我会得到一个用LazySimpleSerDe创建的表,它会将上面列中的记录截断为:

"Freeman,
…这显然是不可取的

如何强制爬虫以正确的SerDe输出文件

[令人不快的]限制:

  • 我不希望用胶水脚本来完成这一点,因为要使它起作用,我相信我必须事先有一个表,而爬虫程序将代表我创建表

如果我必须通过Amazon Athena完成这项工作,我会觉得这在很大程度上违背了目的,但这是一个站得住脚的解决方案。

这将变成一个非常枯燥的答案,但显然AWS提供了对文件是否为CSV进行分类的方法

要分类为CSV,表架构必须至少有两个 列和两行数据。CSV分类器使用许多 确定给定文件中是否存在标头的启发式方法。 如果分类器无法从第一行数据确定标题, 列标题显示为col1、col2、col3等。这个 内置的CSV分类器确定是否通过 评估文件的以下特征:

  • 潜在标头中的每一列都解析为字符串数据类型

  • 除最后一列外,潜在标题中的每一列的内容都少于150个字符。允许拖尾 分隔符,则整个文件的最后一列可以为空

  • 潜在标题中的每一列都必须满足AWS Glue regex对列名的要求

  • 标题行必须与数据行完全不同。要确定这一点,必须将一行或多行解析为 字符串类型。如果所有列都是字符串类型,则 数据与后续行的差异不足以用作 标题

我相信我已经满足了所有这些要求,因为列名与CSV中的实际数据相差很大,理想情况下,应该不会有太大的问题


然而,尽管我相信它会满足AWS Glue正则表达式(我找不到任何地方的定义),我还是选择了从逗号转移到管道。数据现在按照我的预期加载。

使用glueContext。在将csv转换为拼花地板时,从_options()创建_dynamic _frame _,然后在拼花地板数据上运行爬虫程序

df = glueContext.create_dynamic_frame_from_options("s3", {"paths": [src]}, format="csv")
默认分隔符为, 默认quoteChar为“
如果您希望更改,则选中“Glue crawler”将始终选择LazySimpleSerDe。因此,如果您知道您的数据有额外的逗号,需要用双引号转义,则必须在控制台或使用API手动更新表SerDe。@Tanveerudin:这给我带来了一个恼人的鸡和蛋问题。我可以如果表不存在,则不更新表。如果可能的话,我想看看通过外部自动化可以完成多少工作。