如何在其中一个列本身中解析包含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。
答案 0 :(得分: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)
答案 1 :(得分:0)
您可以使用以下内容:
df.withColumn("ID", split(col("xml"), ",").getItem(1))
其中ID是新字段名称,在
中col("xml")
xml
是数据框字段名称
&#34;&#34; - 用分隔符逗号分隔(按要求使用)