【发布时间】:2022-11-19 08:26:46
【问题描述】:
我在用火花2.3.2和蟒蛇3.7解析xml。
在 xml 文件 (sample) 中,我附加了 2 个 xml。
当我解析它时:
os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.databricks:spark-xml_2.11:0.7.0 pyspark-shell'
conf = pyspark.SparkConf()
sc = SparkSession.builder.config(conf=conf).getOrCreate()
spark = SQLContext(sc)
dfSample = (spark.read.format("xml").option("rowTag", "xocs:doc")
.load(r"sample.xml"))
我看到 2 个 xml 的数据:
但是,我需要的是提取下的信息“参考信息”标签(连同它们相应的密钥 eids),所以我的代码是:
(dfSample.
withColumn("metaExp", F.explode(F.array("xocs:meta"))).
withColumn("eid", F.col("metaExp.xocs:eid")).
select("eid","xocs:item").
withColumn("xocs:itemExp", F.explode(F.array("xocs:item"))).
withColumn("item", F.col("xocs:itemExp.item")).
withColumn("itemExp", F.explode(F.array("item"))).
withColumn("bibrecord", F.col("item.bibrecord")).
withColumn("bibrecordExp", F.explode(F.array("bibrecord"))).
withColumn("tail", F.col("bibrecord.tail")).
withColumn("tailExp", F.explode(F.array("tail"))).
withColumn("bibliography", F.col("tail.bibliography")).
withColumn("bibliographyExp", F.explode(F.array("bibliography"))).
withColumn("reference", F.col("bibliography.reference")).
withColumn("referenceExp", F.explode(F.array("reference"))).
withColumn("ref-infoExp", F.explode(F.col("reference.ref-info"))).
withColumn("authors", F.explode(F.col("ref-infoExp.ref-authors.author"))).
withColumn("py", (F.col("ref-infoExp.ref-publicationyear._first"))).
withColumn("so", (F.col("ref-infoExp.ref-sourcetitle"))).
withColumn("ti", (F.col("ref-infoExp.ref-title"))).
drop("xocs:item", "xocs:itemExp", "item", "itemExp", "bibrecord", "bibrecordExp", "tail", "tailExp", "bibliography",
"bibliographyExp", "reference", "referenceExp").show())
这仅从 eid = 85082880163 的 xml 中提取信息
当我删除这个并且只保留 eid = 85082880158 的那个时,它起作用了。
我的文件是一个包含链接中这两行的 xml 文件。我也曾尝试将这两个合并为一个 xml 但无法管理。
我的数据/方法有什么问题? (我的最终计划是创建一个这样的文件,其中包含要解析的数千个不同的 xml)
【问题讨论】:
-
尝试设置一个最小的可重现示例,以便其他人可以帮助您重复您的过程:)
-
请分享您的示例 XML 文件内容。
标签: pyspark xml-parsing