首页 > 解决方案 > Spark XML Parser 未以正确的格式写入输出

问题描述

我有一个要求,我必须触发 SQL 查询以获取输出并将其写入 XML 或 Json 文件格式。

我已经编写了一个程序来做到这一点,但不知何故我没有得到预期的输出。在这个问题中,我将我的 SQL 输出表示为“str”。基本上我的 SQL 存储过程返回 XML 字符串作为输出。

String str = "<?xml version="1.0"?> \n"
            "<ROWSET> \n"
               +"<ROW> \n"
                +"<CTLCORP>001</CTLCORP> \n"
                +"<CTLDIV>05</CTLDIV> \n"
                +"<CTLFAC>2563</CTLFAC> \n"
                +"<CTLVEND_NUM>001878</CTLVEND_NUM> \n"
                +"<CTLVEND_SUB_ACNT>002</CTLVEND_SUB_ACNT> \n"
                +"<CTLCORP_ITEM_CD>75552874</CTLCORP_ITEM_CD> \n"
                +"<CTLSRC_CD>DISC</CTLSRC_CD> \n"
               +"</ROW> \n"
             +"</ROWSET>";


    SparkSession spark = SparkSession.builder().appName("Build a DataFrame from Scratch").master("local[*]")
            .getOrCreate();

    JavaSparkContext sparkContext  = new JavaSparkContext(spark.sparkContext());                                    

    List<String> stringAsList = new ArrayList<String>();
    stringAsList.add(str);

    JavaRDD<Row> rowRDD = sparkContext.parallelize(stringAsList).map((String row) -> {return RowFactory.create(row);});

    // Creates schema
    StructType schema = DataTypes
            .createStructType(new StructField[] { DataTypes.createStructField("value", DataTypes.StringType, false)});      


    Dataset<Row> df = spark.sqlContext().createDataFrame(rowRDD, schema).toDF();
    df.show();              

    df.coalesce(1)
        .write()
        .mode("overwrite")
        .format("com.databricks.spark.xml") 
        .save("./Output/XMLOutput");

    /*
    df.coalesce(1)
        .write()
        .mode("overwrite")      
        .json("./Output/JSONOutput");   
    */

当我将其编写为 XML 文件格式时,该程序会给出这样的输出。

<ROWS>
    <ROW>
        <value>&lt;?xml version="1.0"?&gt;
    &lt;ROWSET&gt;
     &lt;ROW&gt;
      &lt;CTLCORP&gt;001&lt;/CTLCORP&gt;
      &lt;CTLDIV&gt;03&lt;/CTLDIV&gt;
      &lt;CTLFAC&gt;2563&lt;/CTLFAC&gt;
      &lt;CTLVEND_NUM&gt;001878&lt;/CTLVEND_NUM&gt;
      &lt;CTLVEND_SUB_ACNT&gt;002&lt;/CTLVEND_SUB_ACNT&gt;
      &lt;CTLCORP_ITEM_CD&gt;75552874&lt;/CTLCORP_ITEM_CD&gt;
      &lt;CTLSRC_CD&gt;SSIMS&lt;/CTLSRC_CD&gt;      
     &lt;/ROW&gt;
    &lt;/ROWSET&gt;
    </value>
    </ROW>
</ROWS>    

XML 文件格式的预期输出

<ROWSET> 
                   <ROW> 
                    <CTLCORP>001</CTLCORP> 
                    <CTLDIV>03</CTLDIV> 
                    <CTLFAC>2563</CTLFAC> 
                    <CTLVEND_NUM>001878</CTLVEND_NUM> 
                    <CTLVEND_SUB_ACNT>002</CTLVEND_SUB_ACNT> 
                    <CTLCORP_ITEM_CD>75552874</CTLCORP_ITEM_CD> 
                    <CTLSRC_CD>SSIMS</CTLSRC_CD>                         
                   </ROW> 
                  </ROWSET>

有人可以建议我在这里做错了什么吗?当我想将它写为输出时,我需要有适当的 XML 标签。在我的输出中,您可以看到我得到类似'<'、'>'的东西。不知道为什么。

标签: apache-sparkapache-spark-sql

解决方案


您的 DataFrame 架构错误;它说 ROW 有一个字段,值,它是一个字符串。您在那里得到了您所要求的:字符串(恰好是 XML)显示为值的转义子项。

您需要从与您的预期模式匹配的 DataFrame 开始。

但是,如果您已经拥有 XML,除了您已经拥有的 XML 之外,为什么还需要编写任何东西呢?


推荐阅读