Spark XML 解析器未以正确的格式写入输出



我有一个要求,我必须触发一个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 标记。在我的输出中,您可以看到我得到了类似"<"、">"之类的东西。不知道为什么。

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

您需要从与预期架构匹配的数据帧开始。

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

最新更新