sparkDataframe在另存为文本文件时会附加方括号

fjnneemd  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(518)

我试图在hadoop中以append模式保存一个Dataframe。
命令如下:

df.repartition(5).map((row)=>row.toString()).write.mode(SaveMode.Append).text(op_dir)

问题是hdfs文本文件中的数据在行首和行尾有额外的方括号

hadoop dfs -cat op_dir/part*
[1,asdf,p1,Y]
[2,qwer,p2,N]
[3,,p5,Y]

请建议如何在不附加方括号或圆括号的情况下编写Dataframe

zf9nrax1

zf9nrax11#

这会解决你的问题-

val df = Seq(
      ("a", 2, "c"),
      ("a", 2, "c"),
      ("a", 2, "c"),
      ("b", 2, "d"),
      ("b", 2, "d")
    ).toDF("col1", "col2", "col3")
    df.repartition(5).map((row)=>row.toString())
      .write.mode(SaveMode.Append)
      .text("/Users/sokale/models/x")

    /**
      * [a,2,c]
      * [b,2,d]
      */
    df.repartition(5).select(concat_ws(",", df.columns.map(col): _*))
      .write.mode(SaveMode.Append)
      .text("/Users/sokale/models/x2")

    /**
      * a,2,c
      * b,2,d
      */

编辑-1(基于评论)

所有控制字符都使用十进制

df.repartition(5).select(concat_ws("\001", df.columns.map(col): _*))
      .write.mode(SaveMode.Append)
      .text("/Users/sokale/models/x2")
xuo3flqw

xuo3flqw2#

你能做到的

df.repartition(5).map((row) => "%s,%s,%s,%s".format(row(0),row(1),row(2),row(3))).write.mode(SaveMode.Append).text(op_dir)

还是这个

df.repartition(5).map((row) => row.mkString(",")).write.mode(SaveMode.Append).text(op_dir)

笔记
如果你想写(标题的开始)字符,你可以尝试在八进制模式

\001
df.repartition(5).map((row) => row.mkString("\001")).write.mode(SaveMode.Append).text(op_dir)

但已弃用,或使用unicode

\u0001
df.repartition(5).map((row) => row.mkString("\u0001")).write.mode(SaveMode.Append).text(op_dir)
clj7thdc

clj7thdc3#

你可以用csv格式写

df.repartition(5)
  .write.format("csv")
  .mode(SaveMode.Append)
  .save(path)

相关问题