对于上下文:我掠过了以前的问题,但由于两个原因而受到了答案:
:- 我没有在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