0

我试图通过提供 XSD 模式来解析简单的 XML。使用这里给出的方法。

https://github.com/databricks/spark-xml#xsd-support

XML 在这里:

<note>
  <to>aa</to>
  <from>bb</from>
  <heading>cc</heading>
  <body>dd</body>
</note>

XSD 在这里:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="note">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="to" type="xs:string"/>
      <xs:element name="from" type="xs:string"/>
      <xs:element name="heading" type="xs:string"/>
      <xs:element name="body" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

我正在尝试阅读此 XSD 并尝试构建如下所示的架构。

import com.databricks.spark.xml.util.XSDToSchema
import java.nio.file.Paths
val schemaParsed = XSDToSchema.read(Paths.get("<local_linux_path>/sample_file.xsd"))
print(schemaParsed)

这里模式成功解析。接下来我正在阅读如下的 XML 文件。

val df = spark.read.format("com.databricks.spark.xml").schema(schemaParsed).load("<hdfs_path>/sample_file.xml")

在这一步之后,我可以使用 df.printSchema() 显示 Dataframe 的模式,但是如果我给 df.show() 内容就会变成空的

请指导我在这里做错了什么。

注意:这个问题与这个问题完全相同:How to parse XML with XSD using spark-xml package?

但是再次重新发布相同的问题,因为我无法在那里发表评论。提前致谢。

4

1 回答 1

0

我相信您的 XSD 元素名称不正确。您可以使用在线 XSD/XML 验证器之类的工具来找出错误。

这些元素名称是否与您的架构匹配?

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="note">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="to" type="xs:string"/>
      <xs:element name="from" type="xs:string"/>
      <xs:element name="heading" type="xs:string"/>
      <xs:element name="body" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
</xs:schema>

RowTag 你可能还需要传入一个 rowTag 来 spark 来定义标记每一行数据的标签:

.options(rowTag='note')

使用中的实验性功能 根据本文档,XSDToSchema 实用程序是实验性的,仅适用于某些模式。

于 2022-01-26T19:46:01.747 回答