【问题标题】:AWS Glue Crawler Cannot Extract CSV HeadersAWS Glue 爬虫无法提取 CSV 标头
【发布时间】:2022-03-25 04:25:09
【问题描述】:

我的智慧到此为止......

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

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

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

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

一切都很好。其中 14 个。

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

谁能提供任何关于导致此问题的文件可能有什么不同的见解?

如果有帮助,我感觉此 csv 文件中的某些字段可能在某些时候以 UTF-16 或其他格式编码。我一开始打开的时候,有一些奇怪的“?”字符四处飘荡。

我已经在上面运行了tr -d '\000' 来清理它,但这还不够。

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

感谢阅读。

编辑:

感觉这与它有关source

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

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

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

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

【问题讨论】:

  • 嘿,你有没有检查你的标题行最后一行是否有空标题?

标签: csv amazon-athena aws-glue


【解决方案1】:

添加Custom Classifier 解决了我的一个类似问题。

您可以通过在创建自定义分类器时将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'])

【讨论】:

  • 接受此答案,因为它 1) 承认已在已编辑问题中指出的问题的根源,但并未声称对此有任何贡献,并且 2) 提出了可能适用于我的解决方法具体用例。
【解决方案2】:

我遇到了同样的问题,当所有列都是字符串时,Glue 无法识别标题行

我发现在末尾添加一个带有整数的新列可以解决问题

id,name,extra_column sdf13,狗,1

【讨论】:

    【解决方案3】:

    这对我有用,

    分类器名称'您的分类器名称'

    分类器类型'csv'

    列分隔符','(根据您的喜好更改)

    引用符号'"'(应该与列分隔符不同)

    列标题

    • 将此设置为“无标题”
    • 您的自定义列名,例如:userid,username,userphone,useremail

    Sample Example of Custom Classfier

    【讨论】:

      【解决方案4】:

      这是因为所有列值都是字符串。

      我刚刚添加了一个名为 'id' 的列,它的所有行的值为 1(任何整数都可以)。它对我有用。

      【讨论】:

        【解决方案5】:

        我同意@Thom Lane 和@code_freak 使用分类器。这比在整个字符串类型列表的末尾添加一个额外的整数列要好。

        您可以在此处阅读 AWS 官方文档中有关分类器的更多信息:https://docs.aws.amazon.com/glue/latest/dg/console-classifiers.html

        首先,您需要使用列(标题)的名称列表来探索您的数据。然后将名称列表添加到分类器中。之后,当您创建 Crawler 时,在“添加有关您的爬虫的信息”步骤中查找自定义分类器并将其添加到您的 Crawler。

        【讨论】:

          【解决方案6】:

          如果 csv 是由 pandas 生成的并且问题是所有列都是字符串,您可以将 index_label='row_number' 添加到 to_csv 调用以使 pandas 为您创建额外的列(没有 index_label pandas 仍然会打印索引,但不是标题,这仍然会使爬虫感到困惑)。

          【讨论】:

            【解决方案7】:

            胶水标头标识符很脆弱。确保列名是有效的 SQL 名称(即没有空格)并且没有空列名(从 excel 导出时经常发生)

            【讨论】:

              【解决方案8】:

              是的,您对标题部分是正确的,如果 CSV 文件包含所有字符串数据,那么标题也将被视为字符串而不是标题。作为解决方法,请尝试将属性 'skip.header.line.count'='1' 放入表属性中。

              关于“?”您应该使用十六进制编辑器来查看那些无效字符并将它们从文件中删除。

              【讨论】:

                【解决方案9】:

                您提到的最后一个文件可能启用了第一个索引。保存时将其更改为

                df.to_csv('./filenam.csv',index=False)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-05-14
                  • 2019-12-26
                  • 1970-01-01
                  • 2022-08-21
                  • 2018-05-01
                  相关资源
                  最近更新 更多