【问题标题】:How do you write a dataframe/RDD with custom delimeiter (ctrl-A delimited) file in spark scala?如何在 spark scala 中使用自定义分隔符(ctrl-A 分隔)文件编写数据帧/RDD?
【发布时间】:2019-02-23 07:10:51
【问题描述】:

我正在处理 poc,我需要在其中创建数据框,然后将其保存为 ctrl 分隔文件。 我创建中间结果的查询如下

val grouped = results.groupBy("club_data","student_id_add","student_id").agg(sum(results("amount").cast(IntegerType)).as("amount"),count("amount").as("cnt")).filter((length(trim($"student_id")) > 1) && ($"student_id").isNotNull)

将结果保存到文本文件中

grouped.select($"club_data", $"student_id_add", $"amount",$"cnt").rdd.saveAsTextFile("/amit/spark/output4/")

输出:

 [amit,DI^A356035,581,1]

它将数据保存为逗号分隔,但我需要将其另存为 ctrl-A 单独 我尝试了 option("delimiter", "\u0001") 但似乎 dataframe/rdd 不支持它。

有什么有用的功能吗?

【问题讨论】:

  • 您可以在rdd上使用mkString()函数并保存为文本文件。
  • 使用 Spark CSV 写入数据。指定option("delimiter", "\\01")

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


【解决方案1】:

如果您有一个数据框,您可以使用 Spark-CSV 将其写入为带有分隔符的 csv,如下所示。

df.write.mode(SaveMode.Overwrite).option("delimiter", "\u0001").csv("outputCSV")

使用旧版本的 Spark

df.write
    .format("com.databricks.spark.csv")
    .option("delimiter", "\u0001")
    .mode(SaveMode.Overwrite)
    .save("outputCSV")

你可以回读如下

spark.read.option("delimiter", "\u0001").csv("outputCSV").show()

如果您有一个 RDD,则可以在 RDD 上使用 mkString() 函数并使用 saveAsTextFile() 保存

rdd.map(r => r.mkString(\u0001")).saveAsTextFile("outputCSV")

希望这会有所帮助!

【讨论】:

  • 使用 csv 选项我无法编译我的代码错误:“值 csv 不是 org.apache.spark.sql.DataFrameWrite 的成员”
  • [错误] C:\Users\amit.pathak\workspace\SparkPOC\src\com\MapToSpark.scala:69: 错误:值 csv 不是 org.apache.spark.sql 的成员.DataFrameWriter [INFO] grouped.select($"club_data", $"student_id_add", $"amount",$"cnt").write.mode(SaveMode.Overwrite).option("delimiter", "\u0001") .csv("/amit/spark/output6/")
  • 我需要导入什么吗?
【解决方案2】:
df.rdd.map(x=>x.mkString("^A")).saveAsTextFile("file:/home/iot/data/stackOver")

【讨论】:

  • 您使用的是文字 ^A 而不是 Ctrl-A
【解决方案3】:

在保存之前将行转换为文本:

grouped.select($"club_data", $"student_id_add", $"amount",$"cnt").map(row => row.mkString(\u0001")).saveAsTextFile("/amit/spark/output4/") 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 2020-12-04
    • 2014-07-08
    • 2014-11-05
    相关资源
    最近更新 更多