5

如何在其中一个列本身中解析包含 xml 数据的 xml 文件?

在我们的一个项目中,我们收到 xml 文件,其中一些列存储另一个 xml。在将此数据加载到数据框时,内部 xml 被转换为StringType(这不是预期的),因此在查询数据时无法到达节点(使用点运算符)。

我在网上四处寻找生动的答案,但没有运气。在 GitHub 中发现了一个与我的用例完全相同的未解决问题。链接在这里。

https://github.com/databricks/spark-xml/issues/140

我的 xml 源文件如下所示。

+------+--------------------+
|  id  |               xml  |
+------+--------------------+
| 6723 |<?xml version="1....|
| 6741 |<?xml version="1....|
| 6774 |<?xml version="1....|
| 6735 |<?xml version="1....|
| 6828 |<?xml version="1....|
| 6764 |<?xml version="1....|
| 6732 |<?xml version="1....|
| 6792 |<?xml version="1....|
| 6754 |<?xml version="1....|
| 6833 |<?xml version="1....|
+------+--------------------+

在 SQL Server 中,要将 xml 存储在数据库列中,存在XML数据类型,但 Spark SQL 中不存在相同的数据类型。

有没有人遇到过同样的问题并找到任何解决方法?如果是,请分享。我们正在使用 Spark Scala。

4

2 回答 2

1
row_counter = Row('id', 'abc')

def parser_xml(string_xml):
  root = ET.fromstring(string_xml[0])
  col1= root.find('visitor').attrib['id']
  col2= root.find('visitor').attrib['abc']
  return row_counter(id, abc)

data = rdd.map(lambda string_file: parser_xml(string_file)) 
df_xml = spark.createDataFrame(data, schema=None, samplingRatio=None, verifySchema=True)
display(df_xml)
于 2020-04-21T02:45:00.563 回答
1

您可以使用以下内容:

df.withColumn("ID", split(col("xml"), ",").getItem(1))

其中 ID 是一个新的字段名称,并且在

col("xml")

xml是数据框字段名称。
"," - 用分隔符逗号分隔(按要求使用)

于 2018-05-27T16:20:17.110 回答