【问题标题】:Parse nested XML in PySpark在 PySpark 中解析嵌套的 XML
【发布时间】:2022-01-04 08:32:29
【问题描述】:

我在 PySpark 中解析以下 XML 数据时遇到问题。

    <item name="Cake" ppu="0.55">
        <venue place="Bangalore" day="Friday">
            <batters>
                <batter name=Regular/>
                <batter name=Chocolate/>
                <batter name=Blueberry/>
            </batters>
            <topping id="5001">None</topping>
            <topping id="5002">Glazed</topping>
            <topping id="5005">Sugar</topping>
            <topping id="5006">Sprinkles</topping>
            <topping id="5003">Chocolate</topping>
            <topping id="5004">Maple</topping>
        </venue>
    </item>
    <item name="pizza" ppu="0.56"/>
        <batters>
            <batter place="Bangalore" name="Regular"/>
        <batters>
</items>

能够解析第一组项目标签。但我无法解析第二个标签。 任何建议都会有所帮助。

到目前为止,我已经尝试过以下,

df = spark.read\
     .format("com.databricks.spark.xml")
     .option("rowTag", "item")\
     .option("valueTag", True)\
     .load("File.xml")

这只是为我提供了第一个标签的架构。我也无法定义嵌套模式。

【问题讨论】:

    标签: pyspark xml-parsing


    【解决方案1】:

    您的 XML 示例格式不正确。

    应该是这样的:

    <item name="Cake" ppu="0.55">
        <venue place="Bangalore" day="Friday">
            <batters>
                <batter name="Regular"/>
                <batter name="Chocolate"/>
                <batter name="Blueberry"/>
            </batters>
            <topping id="5001">None</topping>
            <topping id="5002">Glazed</topping>
            <topping id="5005">Sugar</topping>
            <topping id="5006">Sprinkles</topping>
            <topping id="5003">Chocolate</topping>
            <topping id="5004">Maple</topping>
        </venue>
    </item>
    <item name="pizza" ppu="0.56">
        <batters>
            <batter place="Bangalore" name="Regular"/>
        </batters>
    </item>
    

    然后将其读取为一个item 一行并在batters 上爆炸:

    from pyspark.sql import SparkSession
    from pyspark.sql import functions as F
    
    spark = SparkSession.builder.config(
        "spark.jars.packages", "com.databricks:spark-xml_2.12:0.13.0"
    ).getOrCreate()
    
    df = (
        spark.read.format("xml")
        .option("rowTag", "item")
        .option("valueTag", True)
        .load("test.xml")
    )
    df.printSchema()
    df = df.withColumn(
        "venue_batters",
        F.explode_outer(F.col("venue.batters.batter")),
    )
    

    结果:

    +-----+----+--------------------+--------------------+-----------------+
    |_name|_ppu|             batters|               venue|    venue_batters|
    +-----+----+--------------------+--------------------+-----------------+
    | Cake|0.55|                null|{Friday, Bangalor...|  {Regular, null}|
    | Cake|0.55|                null|{Friday, Bangalor...|{Chocolate, null}|
    | Cake|0.55|                null|{Friday, Bangalor...|{Blueberry, null}|
    |pizza|0.56|{{Regular, Bangal...|                null|             null|
    +-----+----+--------------------+--------------------+-----------------+
    

    【讨论】:

    • 谢谢弗拉德。如何将击球手列展平为多行?那里卡住了。
    • @JimMacaulay 不客气。我已经更新并包含了一个如何在 vanue 中爆炸击球手的示例,对于项目中的击球手(没有场地)也是如此。我希望这会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多