Как использовать write.df для хранения CSV-файла при использовании Sparkr и Rstudio?

Я изучаю Спаркр. У меня есть CSV-файл:

a <- read.df(sqlContext,"./mine/a2014.csv","csv")

Я хочу использовать write.df для хранения этого файла. Однако, когда я использую:

write.df(a,"mine/a.csv")

Я получаю папку с именем a.csv, в которой вообще нет файла csv.


person Feng Chen    schedule 23.05.2016    source источник
comment
Файлы в папке есть или она совсем пустая?   -  person sgvd    schedule 23.05.2016
comment
папка a.csv включает в себя 5 файлов: _common_metadata, _metadata, _SUCCESS и еще два с очень длинными именами. Но ни один из них не может быть открыт двойным щелчком мыши. Когда я пытаюсь открыть их, я получаю такую ​​информацию: Не удалось отобразить «_common_metadata». Файл неизвестного типа. Кстати. Все это происходит в Linux с использованием vm virtualbox.   -  person Feng Chen    schedule 24.05.2016


Ответы (1)


Spark разделяет ваши данные на блоки, поэтому он может распределять эти разделы по узлам в вашем кластере. При записи данных он сохраняет это разделение: создает каталог и записывает каждый раздел в отдельный файл. Таким образом, он может лучше использовать преимущества распределенных файловых систем (запись каждого блока параллельно с HDFS/S3), и ему не нужно собирать все данные на одной машине, которая может быть не в состоянии обрабатывать объем данных. .

Два файла с длинными именами представляют собой 2 раздела ваших данных и содержат фактические данные CSV. Вы можете увидеть это, скопировав их, переименовав копии с расширением .csv и дважды щелкнув их, или что-то вроде head longfilename.

Вы можете проверить, была ли запись успешной, попытавшись прочитать ее обратно: укажите Spark путь к каталогу, и он распознает его как файл с разделами через метаданные и файлы _SUCCESS, которые вы упомянули.

Если вам нужны все данные в одном файле, вы можете сделать это с помощью repartition чтобы уменьшить количество разделов до 1, а затем напишите это:

b <- repartition(a, 1)
write.df(b,"mine/b.csv")

Это приведет только к одному файлу с длинным именем, который представляет собой файл CSV со всеми данными.

(Я не использую SparkR так непроверенный; в Scala/PySpark вы бы предпочли использовать coalesce, а не repartition, но я не смог найти эквивалентную функцию SparkR)

person sgvd    schedule 24.05.2016
comment
Большое спасибо за ответ. Я многому учусь. Только одно: когда я пытаюсь открыть файл с длинным именем. В нем просто куча бессмысленных символов. - person Feng Chen; 24.05.2016
comment
Теперь я увидел, что SparkR записывает кадры данных в формате Parquet при использовании write.df. Вы должны указать, чтобы писать в формате CSV специально. Вы можете попробовать write.df(b,"mine/b.csv", "csv"), аналогично тому, как вы его читаете, или, возможно, вам нужно указать полную спецификацию формата, как описано в stackoverflow.com/a /34922656/1737727 (опять же, я сам не использую SparkR). - person sgvd; 24.05.2016
comment
Большое спасибо! Я до сих пор не могу понять это. Но я знаю, как использовать для этого write.text и read.text. Так что все в порядке. - person Feng Chen; 25.05.2016