0

Я загружаю xml-файл, используя com.databricks.spark.xml, и я хочу прочитать атрибут тега, используя sql-контекст.Извлечение атрибутов тегов из xml с использованием sparkxml

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

Первая печать схемы в dataframe, в моем случае он будет напечатан, как показано ниже с искровым 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 ("select Sale.Tax ['@ TaxRate'] как TaxRate от соблазнительного"). Show();

Подборка 0

| TaxRate |

+ ----- +

| 10.25 |

Начиная с 0.4.1, я думаю, что атрибуты по умолчанию начинаются с подчеркивания (_), в этом случае просто используйте _ вместо @ при запросе атрибутов.

+0

Спасибо. Я понял проблему с версией и смог распечатать схему, как вы показали здесь. Ваш выбранный Sale.Tax ['@ TaxRate'] помог мне решить мою проблему. Большое спасибо :) – vds

+0

как получить то же самое, если оно попадает под «корень»? – vds

+0

при чтении атрибута атрибута xml для некоторого фиксированного значения с использованием опции («attributePrefix», «_»), а затем при выборе вы можете напрямую выбрать корневой атрибут, как любой другой элемент, например, выбрать _TaxRate из соблазнительного – SanthoshPrasad

Смежные вопросы