0

我使用com.databricks.spark.xml加載xml文件,並且我想使用sql上下文讀取標記屬性。使用sparkxml從xml提取標記屬性

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) 

現在我想提取標記屬性TaxExempt從Tax.I嘗試下面的代碼,它給我錯誤。

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 

任何幫助,高度讚賞。數據幀的

回答

2

首頁打印模式,在我的情況下,它被印像下面火花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屬性,註冊不是Temptable

sqlContext.sql(「選擇Sale.Tax ['@ TaxRate']作爲來自temptable的TaxRate」)。show();

以下是結果

|將TaxRate |

+ ----- +

| 10.25 |

從0.4.1開始,我認爲默認屬性默認以下劃線(_)開頭,在這種情況下,只使用_而不是@查詢屬性。

+0

謝謝。我想出了版本問題,並能夠按照您在這裏顯示的那樣打印架構。您選擇的Sale.Tax ['@ TaxRate']幫助我解決了我的問題。非常感謝:) – vds

+0

如何獲取相同的,如果它在'根'下? – vds

+0

使用選項(「attributePrefix」,「_」)將xml設置屬性前綴讀取爲某個固定值時,然後在選擇時可以像其他任何元素一樣直接選擇root屬性,例如,從temptable中選擇_TaxRate – SanthoshPrasad