4
votes

AWS Glue Crawler ne peut pas extraire les en-têtes CSV

À mon avis, finissez ici ...

J'ai 15 fichiers csv que je génère à partir d'une requête beeline comme:

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

J'ai choisi dsv car certains champs de chaîne contiennent des virgules et ne sont pas entre guillemets, ce qui casse encore plus la colle. De plus, selon la documentation, le classificateur csv intégré peut gérer les tubes (et pour la plupart, il le fait).

Quoi qu'il en soit, je télécharge ces 15 fichiers csv dans un bucket s3 et lance mon robot d'exploration.

Tout fonctionne très bien. Pour 14 d'entre eux.

Glue est capable d'extraire la ligne d'en-tête pour chaque fichier sauf un, en nommant les colonnes col_0 , col_1 , etc., et inclure la ligne d'en-tête dans mes requêtes de sélection.

Quelqu'un peut-il donner un aperçu de ce qui pourrait être différent à propos de ce fichier à l'origine de cela?

Si cela aide, j'ai un sentiment que certains des champs de ce fichier csv peuvent, à un moment donné, être encodés en UTF-16 ou quelque chose comme ça. Quand je l'ai ouvert, il y avait des "?" Bizarres. caractères flottant.

J'ai exécuté tr -d '\ 000' dessus pour essayer de le nettoyer, mais cela n'aurait pas suffi. p >

Encore une fois, toutes les pistes, suggestions ou expériences que je peux exécuter seraient formidables. Btw, je préférerais que le robot d'exploration soit capable de tout faire (c'est-à-dire ne pas avoir besoin de modifier manuellement le schéma et de désactiver les mises à jour).

Merci d'avoir lu.

Modifier:

J'ai le sentiment que cela a quelque chose à voir avec ça source :

Chaque colonne d'un en-tête potentiel est analysée comme un type de données STRING.

À l'exception de la dernière colonne, chaque colonne d'un en-tête potentiel a un contenu de moins de 150 caractères. Pour permettre un délimiteur de fin, la dernière colonne peut être vide dans tout le fichier.

Chaque colonne d'un en-tête potentiel doit répondre aux exigences des expressions régulières AWS Glue pour un nom de colonne.

La ligne d'en-tête doit être suffisamment différente des lignes de données. Pour le déterminer, une ou plusieurs lignes doivent être analysées comme étant d'un type différent de STRING. Si toutes les colonnes sont de type STRING, la première ligne de données n'est pas suffisamment différente des lignes suivantes pour être utilisée comme en-tête.


1 commentaires

Hé, avez-vous vérifié si votre ligne d'en-tête avait un en-tête vide enfin la ligne?


6 Réponses :


-1
votes

Oui, vous avez raison à propos de la partie d'en-tête où si le fichier CSV contient toutes les données de chaîne, l'en-tête sera également considéré comme une chaîne et non comme un en-tête. Pour contourner le problème, essayez de mettre la propriété 'skip.header.line.count' = '1' dans les propriétés de la table.

Concernant "?" vous devez utiliser l'éditeur hexadécimal pour afficher ces caractères invalides et les supprimer du fichier.


0 commentaires

3
votes

J'avais le même problème où Glue ne reconnaît pas la ligne d'en-tête lorsque toutes les colonnes sont des chaînes

J'ai trouvé que l'ajout d'une nouvelle colonne à la fin avec un entier résout le problème

id, nom, extra_column sdf13, chien, 1


0 commentaires

-2
votes

Le dernier fichier que vous avez mentionné peut probablement avoir le premier index activé. Lors de l'enregistrement, remplacez-le par

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


0 commentaires

6
votes

L'ajout d'un classificateur personnalisé a résolu un problème similaire. de la mienne.

Vous pouvez éviter la détection d'en-tête (qui ne fonctionne pas lorsque toutes les colonnes sont de type chaîne) en définissant ContainsHeader sur PRESENT lors de la création du classificateur personnalisé, et puis fournissez les noms de colonne via Header . Une fois que le classificateur personnalisé a été créé, vous pouvez l'affecter au robot d'exploration. Comme cela est ajouté au robot d'exploration, vous n'aurez pas besoin de modifier le schéma après coup et ne risquez pas que ces modifications soient écrasées lors de la prochaine exécution du robot. En utilisant boto3, cela ressemblerait à quelque chose comme:

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 commentaires

Accepter cette réponse parce qu'elle 1) reconnaît la source du problème qui a déjà été signalée dans la question éditée sans en revendiquer le mérite, et 2) propose une solution potentielle qui se serait appliquée à mon cas d'utilisation spécifique.



0
votes

Si le csv est produit par des pandas et que le problème est que toutes les colonnes sont des chaînes, vous pouvez ajouter index_label = 'row_number' à l'appel to_csv pour que les pandas créent le colonne supplémentaire pour vous (sans index_label pandas imprime toujours l'index, mais pas un en-tête, ce qui confond toujours le robot d'exploration).


0 commentaires

0
votes

L'identifiant de l'en-tête de la colle est fragile. Assurez-vous que les noms de colonnes sont des noms SQL valides (c'est-à-dire pas d'espaces) et qu'il n'y a pas de noms de colonnes vides (cela se produit souvent lors de l'exportation depuis Excel)


0 commentaires