2017-08-18 3 views
-1

Je voudrais lire un énorme fichier XML avec 3 RowTags différents dans les données Apache Spark.Lire le fichier XML dans Spark avec plusieurs RowTags

RowTag = L'élément XML, que vous interprétez comme une ligne dans Spark.

Les tags

  • contiennent différentes données Structures
  • ne se chevauchent pas

xml-étincelle (https://github.com/databricks/spark-xml) ne propose que lire un RowTag fois, donc je besoin de lire la même fichier 3 fois (pas efficace).

Est-il possible de lire le fichier en une seule fois?

Détails:

J'ai un énorme fichier XML (24 Go) qui contient 3 listes:

<myFile> 
    <ContainedResourceList> 
     <SoundRecording><Title>A</Title></SoundRecording> 
     ... several million records ... 
     <SoundRecording><Title>Z</Title></SoundRecording> 
    </ContainedResourceList> 

    <ContainedReleaseList> 
     <Release><ReleaseType>Single</ReleaseType></Release> 
     ... several million records ... 
     <Release><ReleaseType>LP</ReleaseType></Release> 
    </ContainedReleaseList> 

    <ContainedTransactionList> 
     <Transaction><Sales>1</Sales></Transaction> 
     ... several million records ... 
     <Transaction><Sales>999</Sales></Transaction> 
    </ContainedTransactionList> 
</myFile> 

Le fichier XML est valide. Je veux lire le RowTags SoundRecording, version & Transaction.

Je préférerais les librairies Scala, mais je serais content pour toute lib permettant la lecture.

PS: Comment la sortie & son regard de schéma comme?

  • meilleure option: Tableau de 3 DataFrames, un pour chaque RowTag
  • truand Option: Un dataframe contenant les éléments possibles de tous les 3 datastructures

Répondre

0

Une façon simple est d'utiliser l'explosion fonction. Vous pouvez lire le fichier XML complet avec l'ensemble rowTag à ContainedResourceList puis avec la trame de données résultant exploser la trame de données avec une nouvelle colonne

df.withColumn("soundRec", explode($"SoundRecording")) 

Vous pouvez ajouter plusieurs colonnes pour chaque balise que vous voulez faire exploser

+0

Je vous remercie pour la solution suggérée. La solution "explode" suggérée fonctionne bien pour les petits fichiers. Mais il échoue sur un énorme fichier (24 Go) avec: 'java.lang.OutOfMemoryError: la taille du tableau demandée dépasse la limite VM' Dans cette solution, l'intégralité de ContainedResourceList est lue dans un enregistrement. ContainedResourceList contient ca. 10 millions de SoundRecordings. La taille ContainedResourceList est ca. 1/3 du fichier d'entrée. J'ai testé sur un cluster de 3 hôtes chaque 8 Go de RAM. Je pourrais utiliser plus de RAM, mais utiliser beaucoup de RAM pour lire le fichier dans son ensemble sur une machine n'était pas l'idée derrière l'utilisation de Spark. – JanDE