使用sparkxml从xml中提取标记属性

时间:2016-11-23 09:49:07

标签: xml apache-spark xml-parsing apache-spark-sql spark-dataframe

我正在使用com.databricks.spark.xml加载xml文件,我想使用sql上下文读取标记属性。

XML:

<Receipt>
<Sale>
<DepartmentID>PR</DepartmentID>
<Tax TaxExempt="false" TaxRate="10.25"/>
</Sale>
</Receipt>

加载文件
val df = sqlContext.read.format("com.databricks.spark.xml").option("rowTag","Receipt").load("/home/user/sale.xml");
df.registerTempTable("SPtable");

打印架构:

root
 |-- Sale: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- DepartmentID: long (nullable = true)
 |    |    |-- Tax: string (nullable = true)

现在我想从Tax中提取标签属性TaxExempt。我尝试了以下代码,它给了我错误。

val tax =sqlContext.sql("select Sale.Tax.TaxExempt from SPtable");

错误:

org.apache.spark.sql.AnalysisException: cannot resolve 'Sale.Tax[TaxExempt]' due to data type mismatch: argument 2 requires integral type, however, 'TaxExempt' is of string type.; line 1 pos 7

任何帮助都是高度赞赏的。

1 个答案:

答案 0 :(得分:2)

数据帧的第一个打印模式,在我的例子中,它使用spark xml version 0.3.3打印如下:

|-- Sale: struct (nullable = true)
|    |-- DepartmentID: string (nullable = true)
|    |-- Tax: struct (nullable = true)
|    |    |-- #VALUE: string (nullable = true)
|    |    |-- @TaxExempt: boolean (nullable = true)
|    |    |-- @TaxRate: double (nullable = true)

然后在注册temptable

之后使用以下查询来选择xml属性

sqlContext.sql(&#34;选择Sale.Tax [&#39; @ TaxRate&#39;]作为来自temptable&#34;)的TaxRate。show();

以下是结果

|将TaxRate |

+ ----- +

| 10.25 |

从0.4.1开始,我认为默认情况下属性以下划线(_)开头,在这种情况下,只需使用_而不是 @ 查询属性。