我尝试加载动态XML文件并将数据转换为DataFrame。我的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)
问题是:000010值(代码)是显示10,因为Scala API将其视为整数。
是否有任何解决方案可以将列"代码"读为字符串以保持值" 000010"?p/s:由于我的项目中的某些相反,不建议使用指定模式的解决方案
val df = sqlContext.read
.format("com.databricks.spark.xml")
.option("rowTag", "book")
.schema(customSchema)
.load("books.xml")
读取XML文件时,API接受几个选项:
路径:文件的位置。类似于Spark可以接受标准的Hadoop Globbing表达式。
rowtag :XML文件的行标签以将其视为行。例如,在此XML ...中,适当的值将是书籍。默认值是行。目前,不支持包含自闭合XML标签的行。
SamplingRatio :推断模式的采样比率(0.0〜1)。默认值为1。可能的类型是structType,arrayType,stringType,longType,doubleStepe,booleantype,timestamptype和nullType,除非用户为此提供架构。
排除tribute :是否要在元素中排除属性。默认值为false。
grethemptyvaluesasnulls :(弃用:使用nullvalue设置为"))是否要将白空间视为零值。默认值为false模式:解析过程中处理损坏记录的模式。默认值是允许的。允许:在符合损坏的记录时将其他字段设置为空,并将畸形的字符串放入由ColumnNameOfCorrupTrecord配置的新字段中。当用户设置模式时,它将为额外字段设置为空。DropMalformed:忽略整个损坏的记录。faffast:遇到损坏的记录时会引发异常。
columnNameOfCorrupTrecord :存储畸形字符串的新字符的名称。默认值为_corrupt_record。
attributeprefix :属性的前缀,以便我们可以区分属性和元素。这将是字段名称的前缀。默认为_。
valuetag :当没有孩子的元素中存在属性时,用于值的标签。默认为_value。
charset :默认为'utf-8',但可以设置为其他有效的charset名称
iNAREROUNDROUNDSPACES :定义是否应跳过读取值的周围空格。默认值为false。
当前有 no Option 可用于在读取XML文件时明确推断某些字段的模式。
因此,在这种情况下需要明确定义架构。
来源:https://github.com/databricks/spark-xml