【问题标题】:How to save array data frame output from spark xml in csv format如何以csv格式保存来自spark xml的数组数据帧输出
【发布时间】:2018-02-06 15:44:35
【问题描述】:

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

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

所以我有一个复杂的嵌套 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...|
+---------+--------------------+

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

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

我希望这次我能把我的问题说清楚。

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

【问题讨论】:

  • 为什么要将这些保存为 CSV? CSV 从根本上说是一种平面数据格式。为什么不使用 Json ?
  • @SarveshKumarSingh 稍后我必须对 csv 文件执行连接 ..
  • 这个问题和stackoverflow.com/questions/48987566/…有关吗?
  • @RameshMaharjan haan 是的,先生……您已经回答了……我无法删除,因为它有答案……

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


【解决方案1】:

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

语法如下:

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

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

【讨论】:

  • csv 不支持数据类型数组
  • 您正在将数据帧写入 csv 文件,对吗?这就是我从你的代码的最后部分理解的
  • 是的,但我们不能这样做,因为 csv 不允许数组类型。所以我的问题是我们如何将这种类型的 xml 转换为文本或 csv,然后写入文本文件
  • 我在这里有点困惑。您已经创建了一个数据框“df”,然后应用了一些转换并创建了一个新的数据框 resDf。在最后一部分中,您将 resDf 数据帧写入 csv。对吗?
  • 到底哪里不工作?在转换为数据框或写入 csv 时?另外,为了加入,我建议你将这两个文件都加载为数据框,使用 registerTempTable 在这些数据框上创建视图,然后你可以直接使用 sql 连接查询。
猜你喜欢
  • 1970-01-01
  • 2018-09-07
  • 2015-12-13
  • 2021-02-16
  • 2020-08-21
  • 2017-10-11
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
相关资源
最近更新 更多