我尝试加载动态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)
问题是:值000010(代码)是显示10,因为Scala API将其视为整数。
是否有任何解决方案将“code”列作为字符串读取以保持值“000010”? P / s:由于我的项目存在一些限制因素,建议不要使用指定模式的解决方案
val df = sqlContext.read
.format("com.databricks.spark.xml")
.option("rowTag", "book")
.schema(customSchema)
.load("books.xml")
答案 0 :(得分:-1)
在阅读XML文件时,API会接受以下几个选项:
路径:文件的位置。与Spark类似,可以接受标准的Hadoop globbing表达式。
rowTag :要作为行处理的xml文件的行标记。例如,在这个xml ...中,适当的值将是book。默认是ROW。目前,不支持包含自关闭xml标记的行。
samplingRatio :推断模式的采样率(0.0~1)。默认值为1.可能的类型是StructType,ArrayType,StringType,LongType,DoubleType,BooleanType,TimestampType和NullType,除非用户为此提供了架构。
excludeAttribute :是否要排除元素中的属性。默认为false。
treatEmptyValuesAsNulls :( DEPRECATED:使用nullValue设置为“”)是否要将空格视为空值。默认值为false mode:解析过程中处理损坏记录的模式。默认为PERMISSIVE。 PERMISSIVE:在遇到损坏的记录时将其他字段设置为null,并将格式错误的字符串放入由columnNameOfCorruptRecord配置的新字段中。当用户设置模式时,它为额外字段设置null。 DROPMALFORMED:忽略整个损坏的记录。 FAILFAST:遇到损坏的记录时抛出异常。
columnNameOfCorruptRecord :存储格式错误的字符串的新字段的名称。默认为_corrupt_record。
attributePrefix :属性的前缀,以便我们可以区分属性和元素。这将是字段名称的前缀。默认为_。
valueTag :元素中没有子元素的属性时用于值的标记。默认值为_VALUE。
charset :默认为“UTF-8”,但可以设置为其他有效的字符集名称
ignoreSurroundingSpaces :定义是否应跳过正在读取的值的周围空格。默认为false。
目前,无选项可用于在读取XML文件时显式推断某些字段的架构。
因此,在这种情况下需要明确定义Schema。