【问题标题】:Converting pipe-delimited file to spark dataframe to CSV file将管道分隔文件转换为火花数据帧到 CSV 文件
【发布时间】:2016-08-25 05:04:12
【问题描述】:

我有一个单列的 CSV 文件,行定义如下:

123 || food || fruit
123 || food || fruit || orange 
123 || food || fruit || apple

我想创建一个具有单列和不同行值的 csv 文件:

orange
apple

我尝试使用以下代码:

 val data = sc.textFile("fruits.csv")
 val rows = data.map(_.split("||"))
 val rddnew = rows.flatMap( arr => {
 val text = arr(0) 
 val words = text.split("||")
 words.map( word => ( word, text ) )
 } )

但是这段代码没有给我想要的正确结果。
谁能帮我解决这个问题?

【问题讨论】:

    标签: scala csv apache-spark spark-streaming rdd


    【解决方案1】:

    您需要使用转义符来拆分特殊字符,因为拆分需要正则表达式

    .split("\\|\\|")
    

    转换为 CSV 很棘手,因为数据字符串可能包含您的分隔符(在引号中)、换行符或其他解析敏感字符,所以我建议使用 spark-csv

     val df = sqlContext.read
      .format("com.databricks.spark.csv")
      .option("delimiter", "||")
      .option("header", "true")
      .option("inferSchema", "true")
      .load("words.csv")
    

     words.write
      .format("com.databricks.spark.csv")
      .option("delimiter", "||")
      .option("header", "true")
      .save("words.csv")
    

    【讨论】:

    • 如何添加 |^| spark csv 输出中的分隔符?
    【解决方案2】:

    你可以用这个代码解决这个问题

    val text = sc.textFile("fruit.csv")
    val word = text.map( l => l.split("\\|\\|")
    val last = word.map( w => w(w.size - 1))
    last.distinct.collect
    

    【讨论】:

    • 谢谢。它有效,但我也想将结果保存为 csv 文件。我尝试做 last.distinct.collect.saveAsTextFile() 但它不起作用说明 saveAsTextFile 不是 Array [String] 的成员。你能帮帮我吗?
    • @user2122466 saveAsTextFile 在 RDD 上定义。 last.distinct.collect 的类型是什么?
    • @maasg :它是一个数组[字符串]。谢谢你。
    • @user2122466 完全是 :-)
    • 如何添加 |^| spark csv 输出中的分隔符?
    猜你喜欢
    • 2019-10-28
    • 1970-01-01
    • 2023-03-15
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多