使用 Spark scala 将数据帧列中存在的 xml 数据转换为多个列

问题描述 投票:0回答:1

我有 df,其中包含 4 列(colA、colB、colC 和 colD),因为 colD 单独包含以 xml 数据形式呈现的字符串数据,如下所示,我需要提取标签的(AN、SOF、LEN、BN、COC ,LA,ST,CT,ZN,TI,PN,PF,PB)并将其作为 df 中的单独列

<variable type="DL" container="EFAO">
  <DD type="String"><![CDATA[XXXXXXXXXXXXXXXXXXXXXXXXXXX]]></DD>
  <SDI type="String"><![CDATA[XXXXXXXXXXXXXXXXXXXXXXXX]]></SDI>
  <AL type="ACC[]"> 
    <item>
        <AN type="String"><![CDATA[000000000]]></AN>
        <FD type="FD">
            <SOF type="String"><![CDATA[XXXXXXXXXXX]]></SOF>
            <LEN type="String"><![CDATA[XXXXXXXXXXX]]></LEN>
            <BN type="String"><![CDATA[XXXXXXXXXXXXXX]]></BN>
            <COC type="String"><![CDATA[XX]]></COC>
            <LA type="String"><![CDATA[XXXXXXXXXXXXX]]></LA>
            <ST type="String"><![CDATA[XXXXXXXXXXXX]]></ST>
            <CT type="String"><![CDATA[XXXXXXXXXXXXX]]></CT>
            <ZN type="String"><![CDATA[XX]]></ZN>
            <TI type="String"><![CDATA[XXXXXX]]></TI>
            <PN type="String"><![CDATA[1234567]]></PN>
            <PF type="String"><![CDATA[sdgfcghj]]></PF>
            <PB type="String"><![CDATA[1234asd]]></PB>
        </FD>
   </item>
  </AL>

下面是我尝试过的代码

val Schema = new StructType().add("AL", new StructType().add("item", new ArrayType(new StructType().add("FD", new ArrayType(new StructType().add("SOF", StringType, true).add("LEN", StringType, true).add("BN", StringType, true).add("COC", StringType, true).add("LA", StringType, true).add("ST", StringType, true).add("CT", StringType, true).add("ZN", StringType, true).add("TI", StringType, true).add("PN", StringType, true).add("PF", StringType, true).add("PB", StringType, true), true), true), true)), true)

val transformedDF = inputdf.withColumn("parsed", from_xml($"colD", Schema))

spark.conf.set("spark.xml.rowTag","parsed")

val df1= transformedDF.select(col("parsed.*"))

val df2= df1.select("AL.item.FD")

val df3 = df2.selectExpr("inline_outer(FD)")

我没有得到想要的输出,请帮助我

提前致谢..

sql xml dataframe scala apache-spark
1个回答
0
投票

您可以尝试 Databricks 的 Spark XML API。

首先,您需要将其导入到您的 Maven 依赖项中。

<dependency>
     <groupId>com.databricks</groupId>
     <artifactId>spark-xml_(scala_version_that_you_use)</artifactId>
     <version>0.6.0</version>
 </dependency>

然后,您可以执行以下操作:

val xmlDf = spark.read
      .format("com.databricks.spark.xml")
      .option("rowTag", "item")
      .xml("<your_xml_file_path>")

我发现您希望将

<item>
下的所有列作为单独的列,因此在
rowTag
选项中提供了项目标签。请注意,这将自行推断模式。

或者,您也可以定义自己的模式。

© www.soinside.com 2019 - 2024. All rights reserved.