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

时间:2019-01-25 21:57:55

标签: csv amazon-athena aws-glue

我的智慧到此为止...

我有15条从beeline查询生成的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,则数据的第一行与随后的行没有足够的不同以用作标题。

6 个答案:

答案 0 :(得分:6)

添加Custom Classifier可以解决我的类似问题。

通过创建自定义分类器时将ContainsHeader设置为PRESENT,然后通过{{1提供列名,可以避免报头检测(当所有列都是字符串类型时,这是行不通的)。 }}。创建自定义分类器后,您可以将其分配给搜寻器。由于已将其添加到搜寻器,因此您无需在事后对架构进行更改,也不必冒险在下一次搜寻器运行中覆盖这些更改。使用boto3,它看起来像:

Header

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

我发现在整数末尾添加新列可以解决问题

id,名称,额外列 sdf13,dog,1

答案 3 :(得分:0)

如果csv是由pandas生成的,而问题是所有列都是字符串,则可以将index_label='row_number'添加到to_csv调用中,以使pandas为您创建额外的列(没有{{1} } pandas仍会打印索引,但不会打印标头,这仍然会使搜寻器感到困惑。

答案 4 :(得分:0)

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

答案 5 :(得分:-2)

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

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