如何以csv格式保存spark xml的数组数据帧输出

时间:2018-02-05 11:22:21

标签: scala apache-spark-sql spark-dataframe apache-spark-xml

我删除了我的两个问题,因为我认为我太大了,我无法解释它。

所以我这次试图让它变得简单。

所以我有一个复杂的嵌套xml。 我在spark scala中解析它,我必须将xml中的所有数据保存到文本文件中。

注意:我需要将数据保存到文本文件中,因为稍后我必须将此数据与另一个文本格式的文件连接起来。 我也可以用json或perquet文件格式加入我的csv文件格式吗?如果是,那么我可能不需要将我的xml转换为文本文件。

这是我的代码,我试图将xml保存到csv文件,但由于csv不允许保存数组类型,所以我收到错误。

我正在寻找一些解决方案,我可以将数据的所有元素都移出并保存到文本文件中。

def main(args: Array[String]) {

    val conf = new SparkConf().setAppName("XML").setMaster("local");
    val sc = new SparkContext(conf); //Creating spark context
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)

    val df = sqlContext.read.format("com.databricks.spark.xml").option("rowTag", "env:Body").load("C://Users//u6034690//Desktop//SPARK//trfsmallfffile//XML")
    val resDf = df.withColumn("FlatType", explode(df("env:ContentItem"))).select("FlatType.*")

    resDf.repartition(1).write
      .format("csv")//This does not support for array Type
      .option("timestampFormat", "yyyy/MM/dd HH:mm:ss ZZ")
      .option("nullValue", "")
      .option("delimiter", "\t")
      .option("quote", "\u0000")
      .option("header", "true")
      .save("C://Users//u6034690//Desktop//SPARK//trfsmallfffile//XML//output")

    // val resDf = df.withColumn("FlatType", when(df("env:ContentItem").isNotNull, explode(df("env:ContentItem"))))
  }

在保存

之前,这使我低于输出
+---------+--------------------+
|  _action|            env:Data|
+---------+--------------------+
|   Insert|[fun:FundamentalD...|
|Overwrite|[sr:FinancialSour...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[pe:FinancialPeri...|
|Overwrite|[fl:FinancialLine...|
|Overwrite|[fl:FinancialLine...|
|Overwrite|[fl:FinancialLine...|
|Overwrite|[fl:FinancialLine...|
|Overwrite|[fl:FinancialLine...|
|Overwrite|[fl:FinancialLine...|
|Overwrite|[fl:FinancialLine...|
|Overwrite|[fl:FinancialLine...|
+---------+--------------------+

Foe每个唯一的env:Data我期待可以使用分区完成的唯一文件但是如何将其保存在文本文件中。

我必须保存数组中的所有元素,我的意思是所有列。

我希望这次我能清楚地表达我的问题。

如果需要,我也可以更新架构。

1 个答案:

答案 0 :(得分:0)

Spark SQL直接写入csv选项。为什么不使用它?

以下是语法:

resDf.write.option("your options").csv("output file path")

这应该将您的文件直接保存为csv格式。