web-dev-qa-db-ja.com

AWS GlueCrawlerはCSVヘッダーを抽出できません

私の知恵はここで終わります...

次のようなbeelineクエリから生成している15個のcsvファイルがあります。

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

一部の文字列フィールドにコンマが含まれていて引用符で囲まれていないため、dsvを選択しました。これにより、接着剤がさらに壊れます。さらに、ドキュメントによると、組み込みのcsv分類子はパイプを処理できます(ほとんどの場合、処理できます)。

とにかく、これらの15個のcsvファイルをs3バケットにアップロードして、クローラーを実行します。

すべてがうまく機能します。それらの14のために。

Glueは、1つを除くすべてのファイルのヘッダー行を抽出し、列にcol_0col_1などの名前を付け、選択したクエリにヘッダー行を含めることができます。

これを引き起こしているこの1つのファイルについて何が異なる可能性があるかについて誰かが洞察を提供できますか?

それが役に立ったら、このcsvファイルの一部のフィールドが、ある時点でUTF-16などでエンコードされている可能性があると感じています。私が最初にそれを開いたとき、いくつかの奇妙な「?」がありました。浮かんでいる文字。

クリーンアップするためにtr -d '\000'を実行しましたが、それだけでは不十分でした。

繰り返しますが、私が実行できるリード、提案、または実験は素晴らしいでしょう。ところで、クローラーがすべてを実行できるかどうかを確認したいと思います(つまり、スキーマを手動で変更して更新をオフにする必要はありません)。

読んでくれてありがとう。

編集:

これはそれと関係があると感じてください ソース

潜在的なヘッダーのすべての列は、STRINGデータ型として解析されます。

最後の列を除いて、潜在的なヘッダーのすべての列には、150文字未満のコンテンツが含まれています。末尾の区切り文字を許可するために、ファイル全体で最後の列を空にすることができます。

潜在的なヘッダーのすべての列は、列名のAWSGlue正規表現要件を満たしている必要があります。

ヘッダー行はデータ行と十分に異なっている必要があります。これを判別するには、1つ以上の行をSTRING型以外として解析する必要があります。すべての列のタイプがSTRINGの場合、データの最初の行は、ヘッダーとして使用される後続の行と十分に異なっていません。

3
Mac

すべての列が文字列である場合、Glueがヘッダー行を認識しないという同じ問題が発生していました

整数で最後に新しい列を追加すると問題が解決することがわかりました

id、name、extra_column sdf13、dog、1

1
comfytoday

カスタム分類子 を追加すると、私の同様の問題が修正されました。

カスタム分類子を作成するときにContainsHeaderPRESENTに設定し、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'])
0
Thom Lane