我有一个要求,我必须触发一个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><?xml version="1.0"?>
<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>
</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之外还需要编写任何内容?