簡體   English   中英

Spark XML-如何在不指定架構的情況下加載XML時強制執行結構類型String

[英]Spark XML - How to enforce struct type String while loading XML with out specifying schema

我嘗試加載動態XML文件並將數據轉換為數據框。 我的XML的例子

<?xml version="1.0"?>
 <catalog>
  <book id="bk104">
   <title>Oberon</title>
   <code>000010</code>
  </book>
  <book id="bk106">
   <title>Lover</title>
   <code>000030</code>
  </book>
</catalog>

使用Scala API:

val df = sqlContext.read
   .format("com.databricks.spark.xml")
   .option("rowTag", "book")
   .load("books.xml")

我嘗試顯示數據框的架構:

root
     |-- title: string (nullable = true)
     |-- price: float (nullable = true)
     |-- code: long (nullable = true)

問題是:因為Scala API將其視為整數,所以顯示10的值為000010(代碼)。

有什么解決方案可以將“代碼”列作為字符串讀取以保持值“ 000010”? P / s:由於我的項目中存在一些矛盾,不建議使用指定架構的解決方案

val df = sqlContext.read
    .format("com.databricks.spark.xml")
    .option("rowTag", "book")
    .schema(customSchema)
    .load("books.xml")

讀取XML文件時,API接受幾個選項:

path :文件位置。 與Spark類似,可以接受標准的Hadoop全局表達式。

rowTag :xml文件的行標記,將其視為一行。 例如,在此xml ...中,適當的值為book。 默認值為ROW。 目前,不支持包含自關閉xml標記的行。

sampleRatio :推斷模式的采樣率(0.0〜1)。 默認值為1。除非用戶為此提供了架構,否則可能的類型為StructType,ArrayType,StringType,LongType,DoubleType,BooleanType,TimestampType和NullType。

excludeAttribute :是否要排除元素中的屬性。 默認為false。

TreatEmptyValuesAsNulls :(不推薦使用:將nullValue設置為“”)是否要將空格視為空值。 默認值為false模式:用於在解析過程中處理損壞的記錄的模式。 默認值為PERMISSIVE。 PERMISSIVE:遇到損壞的記錄時,將其他字段設置為null,並將格式錯誤的字符串放入由columnNameOfCorruptRecord配置的新字段中。 由用戶設置架構時,它會為其他字段設置null。 DROPMALFORMED:忽略整個損壞的記錄。 FAILFAST:遇到損壞的記錄時引發異常。

columnNameOfCorruptRecord :存儲格式錯誤的字符串的新字段的名稱。 默認值為_corrupt_record。

attributePrefix屬性的前綴,以便我們可以區分屬性和元素。 這將是字段名稱的前綴。 默認值為_。

valueTag :元素中沒有子級的屬性時用於值的標簽。 默認值為_VALUE。

charset :默認為'UTF-8',但可以設置為其他有效的字符集名稱

ignoreSurroundingSpaces :定義是否應跳過正在讀取的值周圍的空格。 默認為false。

當前, 沒有選項可用於在讀取XML文件時顯式推斷某些字段的架構。

因此,在這種情況下,需要明確定義Schema。

來源: https : //github.com/databricks/spark-xml

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM