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

Apache spark Spark XML解析器未以正确格式写入输出,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我需要启动一个SQL查询,获取输出并将其写入XML或Json文件格式 我已经写了一个程序来做这件事,但不知怎的,我没有得到预期的输出。在这个问题中,我将SQL输出表示为“str”。基本上,我的SQL存储过程将XML字符串作为输出返回 String str = "<?xml version="1.0"?> \n" "<ROWSET> \n" +"<ROW> \n" +"<

我需要启动一个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");   
    */
String str=“\n”
“\n”
+“\n”
+“001\n”
+“05\n”
+“2563\n”
+“001878\n”
+“002\n”
+“75552874\n”
+“光盘\n”
+“\n”
+"";
SparkSession spark=SparkSession.builder().appName(“从头开始构建数据帧”).master(“本地[*]”)
.getOrCreate();
JavaSparkContext sparkContext=新的JavaSparkContext(spark.sparkContext());
List stringAsList=新建ArrayList();
stringAsList.add(str);
JavaRDD rowRDD=sparkContext.parallelize(stringAsList).map((字符串行)->{return RowFactory.create(行);});
//创建模式
StructType架构=数据类型
.createStructType(新结构域[]{DataTypes.createStructField(“value”,DataTypes.StringType,false)});
Dataset df=spark.sqlContext().createDataFrame(rowRDD,schema.toDF();
df.show();
df.聚结(1)
.write()
.mode(“覆盖”)
.format(“com.databricks.spark.xml”)
.save(“./Output/XMLOutput”);
/*
df.聚结(1)
.write()
.mode(“覆盖”)
.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 version=“1.0”?
行集
一行
CTLCORP001/CTLCORP
CTLDIV03/CTLDIV
CTLFAC 2563/CTLFAC
CTLVEND_编号001878/CTLVEND_编号
CTLVEND\U SUB\U ACNT002/CTLVEND\U SUB\U ACNT
CTLCORP_项目_CD75552874/CTLCORP_项目_CD
CTLSRC_CDSSIMS/CTLSRC_CD
/划船
/行集
预期输出为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>

001
03
2563
001878
002
75552874
SSIMS

有人能告诉我我做错了什么吗?当我想把它写为输出时,我需要有适当的XML标记。在我的输出中,您可以看到我得到了类似于“<”和“>”的东西。不知道为什么

您的数据帧模式错误;它表示该行有一个字段value,即字符串。您在那里得到了您所要求的:字符串(碰巧是XML)显示为值的转义子级

您需要从与预期模式匹配的数据帧开始

如果您已经有了XML,那么为什么除了已经有的XML之外还需要编写其他东西呢