使用 sparkxml 从 xml 中提取标签属性
Extracting tag attributes from xml using sparkxml
我正在使用 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.I 中提取标签属性 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
非常感谢任何帮助。
数据框的第一个打印模式,在我的例子中,它是用 spark xml 版本 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)
然后使用下面的查询 select xml 属性,在注册 temptable
之后
sqlContext.sql("select Sale.Tax['@TaxRate'] as TaxRate from temptable").show();
下面是结果
|税率|
+-----+
|10.25|
从0.4.1开始,我认为属性默认以下划线(_)开头,在这种情况下查询属性时只需使用_而不是@。
我正在使用 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.I 中提取标签属性 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
非常感谢任何帮助。
数据框的第一个打印模式,在我的例子中,它是用 spark xml 版本 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)
然后使用下面的查询 select xml 属性,在注册 temptable
之后sqlContext.sql("select Sale.Tax['@TaxRate'] as TaxRate from temptable").show();
下面是结果
|税率|
+-----+
|10.25|
从0.4.1开始,我认为属性默认以下划线(_)开头,在这种情况下查询属性时只需使用_而不是@。