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