【问题标题】:Extracting tag attributes from xml using sparkxml使用 sparkxml 从 xml 中提取标签属性
【发布时间】:2016-11-23 09:49:06
【问题描述】:

我正在使用 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

非常感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    数据框的第一个打印模式,在我的例子中,它使用 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)
    

    然后在注册临时表后使用下面的查询选择xml属性

    sqlContext.sql("select Sale.Tax['@TaxRate'] as TaxRate from temptable").show();

    下面是结果

    |税率|

    +-----+

    |10.25|

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

    【讨论】:

    • 谢谢。我发现了版本问题,并且能够像您在此处显示的那样打印架构。您选择的 Sale.Tax['@TaxRate'] 帮助我解决了我的问题。非常感谢:)
    • 如果它位于“根”下,如何获取相同的内容?
    • 当使用 option("attributePrefix", "_") 读取 xml 设置属性前缀到某个固定值时,然后选择时可以像任何其他元素一样直接选择根属性,例如,选择 _TaxRate来自诱惑
    猜你喜欢
    • 2015-08-12
    • 2013-07-01
    • 2011-12-14
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多