apache-spark - 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><?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 标签。在我的输出中,您可以看到我得到类似'<'、'>'的东西。不知道为什么。
解决方案
您的 DataFrame 架构错误;它说 ROW 有一个字段,值,它是一个字符串。您在那里得到了您所要求的:字符串(恰好是 XML)显示为值的转义子项。
您需要从与您的预期模式匹配的 DataFrame 开始。
但是,如果您已经拥有 XML,除了您已经拥有的 XML 之外,为什么还需要编写任何东西呢?
推荐阅读
- octave - 带有一些符号参数的 Octave dsolve
- websphere - WebSphere 门户 8.5 集群创建问题
- android - android的ViewModel的奇怪行为
- ios - 如何在 PDFView 中启用连续文本的选择以便我可以添加注释?
- ios - 在离线模式下获取iOS中的时差
- html - Bootstrap 4 - 全高
- shopify - 从管理 api 获取变体返回的“选项”值不一致?
- c++ - 重用 char 数组和 cin.getline
- node.js - 节点 JS 的新行
- php - Connect to Cloud SQL via PHP hosted on Compute Engine