如何使用spark databricks xml解析器从Hdfs目录加载所有xml文件

时间:2017-02-02 19:22:41

标签: scala apache-spark spark-dataframe databricks

如何使用databricks xml解析器获取Hdfs目录中所有xml文件的单个数据帧,该目录具有相同的xml架构

3 个答案:

答案 0 :(得分:0)

我看到你想通过分别读取每个xml并单独处理它们来读取XML数据。下面是它的外观框架。

  

导入scala.xml.XML

     
    

val rdd1 = sc.wholeTextFiles(“/ data / tmp / test / *”)

         

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

  

答案 1 :(得分:0)

将您的maven设置为databricks依赖项

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

然后在spark程序中使用以下代码来读取HDFS xml文件并创建单个数据帧

import 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(“city”,“zipcode”)

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

答案 2 :(得分:0)

你可以使用globbing来做到这一点。请参阅Spark dataframeReader“load”方法。 对于没有路径的数据路由(即不是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可以使用带逗号分隔路径的长字符串

.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来说,iferchema非常繁忙。当涉及很多文件时,我没有取得很大的成功。指定架构更好。如果您可以保证您的XML文件都具有相同的模式,您可以使用它们的一小部分来推断模式,然后加载其余部分。我认为这不安全,因为XML甚至可以“有效”如果它丢失了一些关于XSD的节点或元素。