在文本文件中写入/存储数据帧

时间:2017-06-14 07:12:15

标签: scala apache-spark

我正在尝试将dataframe写入text文件。如果文件包含单列,那么我可以写入文本文件。如果文件包含多列,那么我面临一些错误

  

文本数据源仅支持单个列,您只有2个   列。

object replace {

  def main(args:Array[String]): Unit = {

    Logger.getLogger("org").setLevel(Level.ERROR)

    val spark = SparkSession.builder.master("local[1]").appName("Decimal Field Validation").getOrCreate()

    var sourcefile = spark.read.option("header","true").text("C:/Users/phadpa01/Desktop/inputfiles/decimalvalues.txt")

     val rowRDD = sourcefile.rdd.zipWithIndex().map(indexedRow => Row.fromSeq((indexedRow._2.toLong+1) +: indexedRow._1.toSeq)) //adding prgrefnbr               
                         //add column for prgrefnbr in schema
     val newstructure = StructType(Array(StructField("PRGREFNBR",LongType)).++(sourcefile.schema.fields))

     //create new dataframe containing prgrefnbr

     sourcefile = spark.createDataFrame(rowRDD, newstructure)
     val op= sourcefile.write.mode("overwrite").format("text").save("C:/Users/phadpa01/Desktop/op")

  }

}

5 个答案:

答案 0 :(得分:4)

你可以将数据帧转换为rdd并将行转换为字符串并将最后一行写为

 val op= sourcefile.rdd.map(_.toString()).saveAsTextFile("C:/Users/phadpa01/Desktop/op")

已修改

正如@philantrovert和@Pravinkumar指出的那样,上面会在输出文件中附加[],这是真的。解决方案是replaceempty字符作为

val op= sourcefile.rdd.map(_.toString().replace("[","").replace("]", "")).saveAsTextFile("C:/Users/phadpa01/Desktop/op")

甚至可以使用regex

答案 1 :(得分:2)

我认为使用“子字符串”更适合我认为的所有情况。

请检查以下代码。

sourcefile.rdd
.map(r =>  { val x = r.toString; x.substring(1, x.length-1)})
.saveAsTextFile("C:/Users/phadpa01/Desktop/op")

答案 2 :(得分:1)

您可以另存为 CSV 文件(where

结果将是CSV格式的文本文件,每列将用逗号分隔。

select sum( some_data )
  from your_table
 where _here_you_limit_the_rows_to_be_processed_

可以在spark programming guide

中找到更多信息

答案 3 :(得分:1)

我使用databricks api将我的DF输出保存到文本文件中。

    var users  = UserManager.Users.Where(x=>x.Roles.Any(y=>y.RoleId==role.Id))
                    .Select(x => new {UserId = x.Id,FullName = x.FullName });

答案 4 :(得分:1)

我建议使用csv或其他分隔格式。以下是使用简洁/优雅方式在Spark 2 +中写入.tsv的方法的示例

val tsvWithHeaderOptions: Map[String, String] = Map(
  ("delimiter", "\t"), // Uses "\t" delimiter instead of default ","
  ("header", "true"))  // Writes a header record with column names

df.coalesce(1)         // Writes to a single file
  .write
  .mode(SaveMode.Overwrite)
  .options(tsvWithHeaderOptions)
  .csv("output/path")