2017-02-02 10 views
0

Как получить один dataframe всех файлов XML в каталоге HDFS, который имеющей ту же схему XML с помощью databricks XML ParserКак загрузить все файлы XML из каталога HDFS с помощью искру databricks XML Parser

+0

Это плохо структурированный вопрос. Вы должны представить пример того, что вы уже пробовали и не работаете для вас. Вы получите лучшие ответы таким образом. – Davos

ответ

0

Я вижу, что вы хотите читать данные XML, читая каждый xml отдельно и обрабатывая их индивидуально. Ниже представлен скелет о том, как он будет выглядеть.

импорта scala.xml.XML

вал rdd1 = sc.wholeTextFiles ("/ данные/TMP/тест/*")

вал XML = rdd1.map (х => XML.loadString (_._ 2.toString())

0

Настройка вашего Maven для databricks зависимостей, как

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

Затем используйте ниже код в вашей программе искрового читать HDFS XML-файлы и создать единый dataframe

импорт org.apache.spark.sql.SQLContext

вал sqlContext = новый SQLContext (п)

вал 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") 

вал selectedResult = df.select ("город", "почтовый индекс")

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") 

Найти полный пример в GitHub:

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

0

Вы можете сделать это с помощью подстановка. См. Метод загрузки нагрузки Spark dataframeReader. Нагрузка может принимать одну строку пути, последовательность путей или отсутствие аргументов для данных, которые не имеют путей (т. Е. Не HDFS или S3 или другой файловой системы). 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") 

нагрузка может занять длинную строку с запятыми трактов

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

или сходного с этим ответом Reading multiple files from S3 in Spark by date period

Вы можете также использовать последовательность путей

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

Обратите внимание, что инфрашерм довольно сумасшедший для XML. У меня не было большого успеха, когда было много файлов. Указание схемы работает лучше. Если вы можете гарантировать, что ваши файлы XML имеют одну и ту же схему, вы можете использовать небольшой образец из них для вывода схемы, а затем загрузить остальные из них. Я думаю, что это небезопасно, потому что XML все еще может быть «действительным» даже если ему не хватает некоторых узлов или элементов в отношении XSD.