Comment obtenir un dataframe de tous les fichiers xml dans un répertoire HDFS, qui ayant même schéma XML à l'aide databricks analyseur XMLComment charger tous les fichiers XML à partir d'un répertoire HDFS à l'aide étincelle databricks analyseur XML
Répondre
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())
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
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.
Cette question est mal structurée. Vous devriez fournir un exemple de ce que vous avez déjà essayé et ne fonctionne pas pour vous. Vous obtiendrez de meilleures réponses de cette façon. – Davos