如何使用databricks xml解析器获取Hdfs目录中所有xml文件的单个数据框,这些文件具有相同的xml架构
3 回答
您可以使用通配符来做到这一点。请参阅 Spark dataframeReaderload
方法。
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: _*)
请注意,这inferschema
对于 XML 来说非常忙碌。当涉及很多文件时,我没有取得很大的成功。指定模式效果更好。如果您可以保证您的 XML 文件都具有相同的架构,您可以使用其中的一小部分样本来推断架构,然后将其余的加载进去。我认为这并不安全,因为 XML 仍然可以是“有效的”甚至如果它缺少与 XSD 相关的某些节点或元素。
将你的 maven 设置为 databricks 依赖项
https://mvnrepository.com/artifact/com.databricks/spark-xml_2.10/0.2.0
然后在您的 spark 程序中使用以下代码来读取 HDFS xml 文件并创建单个数据帧
导入 org.apache.spark.sql.SQLContext
val sqlContext = 新 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
我看到您想通过分别读取每个 xml 并单独处理它们来读取 XML 数据。下面是关于它的外观的框架。
导入 scala.xml.XML
val rdd1 = sc.wholeTextFiles("/data/tmp/test/*")
val xml = rdd1.map(x=>XML.loadString(_._2.toString())