【问题标题】:pyspark does not parse an xml from a file containing multiple xmlspyspark 不会从包含多个 xml 的文件中解析 xml
【发布时间】: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


【解决方案1】:

您的麻烦在于这段 XML:

<xocs:item>
  <item>
    <bibrecord>
      <head>
        <abstracts>
          <abstract original="y" xml:lang="eng">
            <ce:para>
              Apple is often affected by [...] intercellular CO <inf>2</inf> concentration [...]
                                                                ^^^^^^^^^^^^

虽然它是正确的 XML (mixed content),但这个嵌入式标记 &lt;inf&gt;2&lt;/inf&gt; 似乎正在破坏 spark-xml 解析器。如果您删除它(或转换为相应的HTML entities),您将得到正确的结果。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    相关资源
    最近更新 更多