Spark XML - 如何在加载XML时强制执行struct type String而不指定schema

时间:2017-09-24 01:23:15

标签: xml apache-spark

我尝试加载动态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")

1 个答案:

答案 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。

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