2017-02-02 17 views

回答

0

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

进口scala.xml.XML

VAL RDD1集= sc.wholeTextFiles( “/数据/ TMP /测试/ *”)

VAL XML = rdd1.map(X => XML.loadString(_._ 2.toString())

0

设置你的databricks依赖Maven作为

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

然后使用下面的代码在你的星火计划读取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( “城市”, “邮政编码”)

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“load”方法。 加载可以为没有路径(即不是HDFS或S3或其他文件系统)的datasrouces采用单个路径字符串,一系列路径或无参数。 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相关的节点或元素。