1
votes

Obtenez un fichier csv massif de GCS vers BQ

J'ai un très gros fichier CSV (disons 1 To) dont j'ai besoin pour obtenir de GCS vers BQ. Bien que BQ ait un chargeur CSV, les fichiers CSV que je possède ne sont pas standard et ne finissent pas par se charger correctement dans BQ sans le formater.

Normalement, je téléchargerais le fichier csv sur un serveur pour le «traiter» et l'enregistrer soit directement sur BQ, soit dans un fichier avro qui peut être facilement ingéré par BQ. Cependant, le (s) fichier (s) sont assez volumineux et il est tout à fait possible (et probablement) que je n'aurais pas le stockage / la mémoire pour faire le traitement par lots sans écrire beaucoup de code pour l'optimiser / le diffuser.

S'agit-il d'un bon cas d'utilisation de Cloud Dataflow? Existe-t-il des didacticiels pour obtenir un fichier au format «X» de GCS vers BQ? Tout pointeur de didacticiel ou exemple de script pour le faire serait génial.


2 commentaires

Dataflow peut le faire avec Python ou Java, et Dataprep peut également le faire pour vous.


@Pablo y a-t-il des exemples de liens qui montreraient comment une telle chose pourrait être réalisée à l'aide de Dataflow?


3 Réponses :


2
votes

J'envisagerais d'utiliser Cloud Dataprep .

Dataprep peut importer des données depuis GCS, nettoyer / modifier les données et les exporter vers BigQuery. Une des fonctionnalités que j'aime est que tout peut être fait visuellement / interactivement pour que je puisse voir comment les données se transforment.

Commencez par un sous-ensemble de vos données pour voir quelles transformations sont nécessaires et pour vous entraîner avant de charger et de traiter un To de données.


6 commentaires

Merci pour la suggestion. Quelle serait la différence entre l'utilisation de Dataflow et Dataprep? Est-ce que cela fonctionnerait pour le poste ou Cloud Dataflow ne serait-il pas une option pour ce qui précède?


Dataflow utilise un logiciel (généralement Python) et Dataprep utilise un tableau de bord visuel. Les deux feront ce que vous voulez, juste des techniques différentes.


J'ai essayé d'utiliser l'interface de Dataprep à quelques reprises et à chaque fois, j'ai rencontré des limitations lors de l'importation de fichiers. Par exemple, les fichiers json devaient être json-newline, etc. Chaque fois que je l'utilisais, j'étais en fait incapable d'accomplir ce dont j'avais besoin, donc je pense que Dataflow serait peut-être mieux pour cette tâche.


Un fait curieux est que Dataprep génère des pipelines Dataflow et les exécute. Dataprep étant un outil visuel est plus limité que l'écriture d'un pipeline Dataflow avec le SDK lui-même.


@Pablo - D'accord. Tout le monde ne peut pas écrire (ni même vouloir écrire) un programme Python ou Java. Certains analystes veulent des outils visuels ou par glisser-déposer et n'exigent pas que les développeurs écrivent des programmes pour eux. Je suis développeur et j'essaie d'utiliser les bons outils pour le travail. Parfois, il s'agit de Dataprep, parfois de Dataflow, parfois de Dataproc et parfois d'un simple script Python s'exécutant sur GCE en lisant et en réécrivant dans GCS avant d'importer directement dans BQ.


Il convient de souligner que bien que Dataprep génère et exécute simplement des tâches Dataflow sous le capot (pipelines Apache Beam), il s'agit en fait d'un outil tiers de Trifacta repensé dans la console GCP, vous devez donc accepter de partager les informations de votre compte avec eux avant en utilisant l'outil.



0
votes

Vous pouvez toujours transférer d'un bucket de stockage directement dans une table BQ:

bq --location=US load --[no]replace --source_format=CSV dataset.table gs://bucket/file.csv [schema]

Ici, [schema] peut être un schéma en ligne de votre fichier csv ( comme id: int, name: string, .. ) ou un chemin vers un fichier de schéma JSON (disponible localement).

Selon la documentation de BQ, ils essaient de paralléliser de grandes charges CSV dans des tables. Bien sûr, il y a une limite supérieure impliquée: la taille maximale d'un fichier non compressé (csv) à charger de GCS vers BQ doit être


2 commentaires

en théorie, cela fonctionne bien. Cependant, dans la pratique, les fichiers ne sont généralement pas "prêts pour BQ". Par exemple, le séparateur (de champ) dans un fichier peut être un délimiteur non standard tel que \ x01 , peut ne pas commencer sur la première ligne, peut avoir des caractères de commentaire, etc. Compte tenu de cette exigence, comment suggéreriez-vous de le faire alors?


à partir de ce lien ici - cloud.google.com/bigquery / docs / loading-data-cloud-storage-cs‌ v - nous rencontrerions quatre de leurs quatre limitations, et notre encodage csv (section délimiteurs) ne fonctionnerait pas non plus pour BQ. En d'autres termes, nous devons «prétraiter» le fichier.



2
votes

J'utiliserais personnellement Dataflow (et non Dataprep) et j'écrirais un simple pipeline pour lire le fichier en parallèle, le nettoyer / le transformer et enfin l'écrire dans BigQuery. C'est assez simple. Voici < / a> un exemple d'un dans mon dépôt GitHub. Bien qu'il soit en Java, vous pouvez facilement le porter en Python. Remarque: il utilise la fonctionnalité "modèles" de Dataflow, mais cela peut être modifié avec une seule ligne de code.

Si Dataflow est en dehors de la table, une autre option peut être d'utiliser un délimiteur étrange / inutilisé et de lire la ligne entière dans BigQuery. Utilisez ensuite SQL / Regex / UDF pour le nettoyer / le transformer / l'analyser. Voir ici (suggestion de Felipe). Nous l'avons fait de nombreuses fois dans le passé, et comme vous êtes dans BigQuery, cela évolue très bien.


1 commentaires

approche très intéressante sur ce qui précède en utilisant un délimiteur étrange. J'ai parfois utilisé cela dans les pandas pour rassembler toutes les données dans une colonne. Cependant, une chose que nous rencontrons en utilisant cette approche, c'est que les lignes n'ont parfois pas de délimiteur \ n . J'ai vu des terminateurs de champ tels que \ x02 , et donc un seul enregistrement s'étendrait sur deux (ou plus) lignes. Y a-t-il un moyen possible de résoudre ce problème avec l'approche BQ?