2017-02-02 2 views

Répondre

0

Je vois que vous Vous voulez lire les données XML en lisant chaque xml séparément et les traiter individuellement. Ci-dessous est un squelette quant à la façon dont il va chercher.

importation scala.xml.XML

val RDD1 = sc.wholeTextFiles ("/ data/tmp/test/*")

val xml = rdd1.map (x => XML.loadString (_._ 2.toString())

0

votre configuration Maven pour les dépendances de databricks comme

https://mvnrepository.com/artifact/com.databricks/spark-xml_2.10/0.2.0

Ensuite, utilisez le code ci-dessous dans votre programme d'étincelle pour lire les fichiers xml HDFS et créer un seul dataframe

importation org.apache.spark.sql.SQLContext

val SqlContext = new SqlContext (sc)

val df = sqlContext.read .format ("com.databricks.spark.xml")

.option("rowTag", "address") //The row tag of your xml files to treat as a row 

.load("file.xml") 

val selectedResult = df.select ("ville", "code postal")

selectedResult.write

.format("com.databricks.spark.xml") 

.option("rootTag", "address") //The root tag of your xml files to treat as the root 

.option("rowTag", "address") 

.save("result.xml") 

Trouvez exemple complet en github:

https://github.com/databricks/spark-xml/blob/master/README.md

0

Vous pouvez le faire en utilisant globbing. Voir la méthode Spark dataframeReader "load". La charge peut prendre une chaîne de chemin unique, une séquence de chemins ou aucun argument pour les données qui n'ont pas de chemins (c'est-à-dire pas HDFS ou S3 ou un autre système de fichiers). http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.DataFrameReader

val df = sqlContext.read.format("com.databricks.spark.xml") 
.option("inferschema","true") 
.option("rowTag", "address") //the root node of your xml to be treated as row 
.load("/path/to/files/*.xml") 

charge peut prendre une longue chaîne avec des chemins séparés par des virgules

.load("/path/to/files/File1.xml, /path/to/files/File2.xml") 

ou similaire à cette réponse Reading multiple files from S3 in Spark by date period

Vous pouvez également utiliser une séquence de chemins

val paths: Seq[String] = ... 
val df = sqlContext.read.load(paths: _*) 

Notez que l'inferschema est assez mouvementé pour XML. Je n'ai pas eu beaucoup de succès quand il y a beaucoup de fichiers impliqués. La spécification du schéma fonctionne mieux. Si vous pouvez garantir que vos fichiers XML ont tous le même schéma, vous pouvez en utiliser un petit échantillon pour inférer le schéma et charger le reste. Je ne pense pas que ce soit sûr, car XML peut encore être "valide" même s'il manque des nœuds ou des éléments concernant un XSD.