Apache spark Spark XML解析器未以正确格式写入输出
我需要启动一个SQL查询,获取输出并将其写入XML或Json文件格式 我已经写了一个程序来做这件事,但不知怎的,我没有得到预期的输出。在这个问题中,我将SQL输出表示为“str”。基本上,我的SQL存储过程将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" +"<
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><?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 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之外还需要编写其他东西呢