如何确保我编写的 AWS Glue 爬虫使用的是 OpenCSV SerDe 而不是 LazySimpleSerDe?



对于上下文:我掠过了以前的问题,但由于两个原因而受到了答案:

  • 我没有在Python写任何东西;实际上,我根本没有为此编写任何自定义脚本,因为我依靠爬行者而不是胶水脚本。
  • 答案不像我需要的那样完整,因为它只是某个库的链接。

我希望利用AWS胶水将某些CSV接受为模式,并使用雅典娜将CSV表转换为多个镶木形式的表,以实现ETL的目的。我与之合作的数据中嵌入了引号,这是可以的,除了我拥有的一个记录值为

的事实外,这是可以的。
"blablabla","1","Freeman,Morgan","bla bla bla"

胶水在遇到"Freeman,Morgan"数据时似乎正在绊倒自身。

如果我使用标准胶arawler,我会得到一张使用lazysimpleserde创建的表,该表将上面的记录截断为:

"Freeman,

...显然不是可取的。

如何强制使用正确的serde输出文件?

[不愉快]约束:

  • 寻找不是用胶水脚本来完成此操作,因为要工作,我相信我必须事先拥有一张桌子,而爬行者将 create create 我代表。

如果我必须通过亚马逊雅典娜(Amazon Athena)进行所有操作,我会觉得这将在很大程度上违反目的,但这是一个可行的解决方案。

这将变成一个非常乏味的答案,但是显然,AWS提供了自己的一组规则,用于分类如果文件为CSV。

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

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

  • 除最后一列外,潜在标头中的每个列的内容都少于150个字符。允许尾随 定界符,最后一列可以在整个文件中为空。

  • 潜在标头中的每一列都必须满足列名称的AWS胶条正则要求。

  • 标题行必须与数据行完全不同。为了确定这一点,除了一个或多个行以外,必须分析一个或多个行 字符串类型。如果所有列都是类型字符串,则 数据与后续行没有足够的不同,以至于 标题。

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

但是,尽管我相信它会满足AWS胶条正则(我在任何地方都找不到定义),但我选择将 ake 从逗号和管道转移到管道上。现在,数据按照我的期望加载。

使用gluecontext.create_dynamic_frame_from_options()将CSV转换为parquet,然后通过Parquet数据运行crawler。

df = glueContext.create_dynamic_frame_from_options("s3", {"paths": [src]}, format="csv")

默认分离器是,默认的被Foquechar是"如果您想更改,请检查https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-eetl-format.html

相关内容

  • 没有找到相关文章

最新更新