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对列名的要求
- 标题行必须与数据行完全不同。要确定这一点,必须将一行或多行解析为 字符串类型。如果所有列都是字符串类型,则 数据与后续行的差异不足以用作 标题
然而,尽管我相信它会满足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:这给我带来了一个恼人的鸡和蛋问题。我可以如果表不存在,则不更新表。如果可能的话,我想看看通过外部自动化可以完成多少工作。