AWS Glue 爬网程序无法提取 CSV 标头

2024-01-10

我已经无计可施了……

我有 15 个 csv 文件,它们是通过直线查询生成的,例如:

beeline -u CONN_STR --outputformat=dsv -e "SELECT ... " > data.csv

I chose dsv因为某些字符串字段包含逗号并且不加引号,这会更加破坏粘合性。此外,根据文档,内置的 csv 分类器可以处理管道(并且在大多数情况下,确实如此)。

不管怎样,我将这 15 个 csv 文件上传到 s3 存储桶并运行我的爬虫。

一切都很好。对于其中 14 个人来说。

Glue 能够提取除一个文件之外的每个文件的标题行,并命名列col_0, col_1等,并在我的选择查询中包括标题行。

任何人都可以深入了解导致此问题的这个文件可能有什么不同吗?

如果有帮助的话,我感觉这个 csv 文件中的某些字段可能在某些时候被编码为 UTF-16 或其他格式。刚打开的时候,有一些奇怪的“?”。角色漂浮在周围。

我已经跑了tr -d '\000'试图清理它,但这可能还不够。

再说一遍,我可以运行的任何线索、建议或实验都很棒。顺便说一句,我希望爬虫能够执行所有操作(即:不需要手动更改架构并关闭更新)。

谢谢阅读。

Edit:

感觉这与它有关source https://docs.aws.amazon.com/glue/latest/dg/add-classifier.html#classifier-built-in:

潜在标头中的每一列都会解析为 STRING 数据类型。

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

潜在标题中的每一列都必须满足列名称的 AWS Glue 正则表达式要求。

标题行必须与数据行有足够的不同。要确定这一点,必须将一行或多行解析为 STRING 类型以外的类型。如果所有列的类型均为 STRING,则第一行数据与用作标题的后续行没有足够的差异。


添加一个自定义分类器 https://docs.aws.amazon.com/glue/latest/dg/add-classifier.html修复了我的类似问题。

您可以通过设置来避免标题检测(当所有列都是字符串类型时,这不起作用)ContainsHeader to PRESENT创建自定义分类器时,然后通过提供列名称Header。创建自定义分类器后,您可以将其分配给爬网程序。由于这已添加到爬网程序中,因此您无需在事后对架构进行更改,并且不会冒这些更改在下一次爬网程序运行中被覆盖的风险。使用 boto3,它看起来像:

import boto3


glue = boto3.client('glue')

glue.create_classifier(CsvClassifier={
    'Name': 'contacts_csv',
    'Delimiter': ',',
    'QuoteSymbol': '"',
    'ContainsHeader': 'PRESENT',
    'Header': ['contact_id', 'person_id', 'type', 'value']
})

glue.create_crawler(Name=GLUE_CRAWLER,
                    Role=role.arn,
                    DatabaseName=GLUE_DATABASE,
                    Targets={'S3Targets': [{'Path': s3_path}]},
                    Classifiers=['contacts_csv'])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS Glue 爬网程序无法提取 CSV 标头 的相关文章

随机推荐