Фрейм данных Spark добавляется квадратными скобками при сохранении в виде текстового файла - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь сохранить фрейм данных в has oop в режиме добавления.

Ниже приведена команда:

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]

Пожалуйста, предложите, как написать фрейм данных без добавления квадратных скобок или скобок

Ответы [ 3 ]

2 голосов
/ 28 мая 2020

Вы можете сделать это

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)

, но устарело, или в юникоде

\u0001
df.repartition(5).map((row) => row.mkString("\u0001")).write.mode(SaveMode.Append).text(op_dir)
0 голосов
/ 28 мая 2020

Можно писать в формате CSV

df.repartition(5)
  .write.format("csv")
  .mode(SaveMode.Append)
  .save(path)
0 голосов
/ 28 мая 2020

Это решит вашу проблему -

   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
      */

edit-1 (на основе комментария)

Используйте десятичное число для всех управляющих символов

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