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) 

は、今私は、タグを抽出したいが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 

すべてのヘルプは高く評価されています。データフレームの

答えて

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) 

その後TEMPTABLE

を登録した後、XML属性を選択するには、以下のクエリを使用します

sqlContext.sql( "temptableからTaxRateとしてSale.Tax ['@ TaxRate']を選択してください)")。

以下は結果です

|税率|

+ -

| 10.25 |

0.4.1から、属性はデフォルトでアンダースコア(_)で始まります。この場合は、属性を照会しているうちに@の代わりに_を使用してください。

+0

ありがとうございます。私はバージョンの問題を理解し、あなたがここに示したようにスキーマを印刷することができました。選択したSale.Tax ['@ TaxRate']は私の問題を解決するのに役立ちました。ありがとうたくさん:) – vds

+0

それは 'ルート'の下に来る場合、同じをフェッチする方法? – vds

+0

オプション( "attributePrefix"、 "_")を使用してxml set属性の接頭辞をいくつかの固定値に読み込み、選択すると他の要素と同様にルート属性を直接選択できます。たとえば、temptableから_TaxRateを選択します。 – SanthoshPrasad