AWS Glue Crawler 无法提取 CSV 标头

Mac*_*Mac 8 csv amazon-athena aws-glue

在我的智慧结束这里......

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

beeline -u CONN_STR --outputformat=dsv -e "SELECT ... " > data.csv
Run Code Online (Sandbox Code Playgroud)

我选择dsv是因为一些字符串字段包含逗号并且它们没有被引用,这会进一步破坏胶水。此外,根据文档,内置的 csv 分类器可以处理管道(并且在大多数情况下,它确实如此)。

无论如何,我将这 15 个 csv 文件上传到一个 s3 存储桶并运行我的爬虫。

一切都很好。对于其中的 14 个。

胶能够提取标题行的每一个文件,除了一个,命名列col_0col_1等等,以及包括我的选择查询标题行。

任何人都可以提供有关导致这种情况的这个文件可能有什么不同的任何见解吗?

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

我跑了 tr -d '\000'在努力清理它,但这还不够。

同样,我可以运行的任何线索、建议或实验都会很棒。顺便说一句,我希望爬虫能够做所有事情(即:不需要手动更改架构和关闭更新)。

谢谢阅读。

编辑:

有一种感觉,这与它的来源有关

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

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

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

标题行必须与数据行充分不同。要确定这一点,必须将一个或多个行解析为非 STRING 类型。如果所有列都是 STRING 类型,则第一行数据与用作标题的后续行没有足够的不同。

小智 9

添加自定义分类器修复了我的类似问题。

您可以通过在创建自定义分类器时设置ContainsHeader为来避免标题检测(当所有列都是字符串类型时不起作用)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'])
Run Code Online (Sandbox Code Playgroud)