2015-01-09 3 views
0

Команда hdfs.write() в формате rhdfs создает файл с ведущим символом, отличным от юникода. Документация не описывает записываемый тип файла.Строковый символ в выводе RHDFS

Шаги, чтобы воссоздать. 1. Открыть R и инициализировать rhdfs

> ofile = hdfs.file("brian.txt", "w") 
> hdfs.write("hi",ofile) 
> hdfs.close(ofile) 

Создает файл с именем «brian.txt», который я мог бы ожидать, содержит одну строку, «привет». Но это показывает и добавляет характер в начале.

> hdfs dfs -cat brian.txt 
X 
    hi 

Я понятия не имею, какой тип файла создан, и rhdfs не показывает никаких параметров типа файла. Это делает вывод очень сложным в использовании.

ответ

3

Если вы посмотрите на hdfs.write функции в source code, вы можете увидеть, что это может занять исходные байты вместо того, чтобы R сериализовать его для вас. Таким образом, вы можете сделать это для символов

ofile = hdfs.file("brian.txt", "w") 
hdfs.write(charToRaw("hi", ofile)) 
hdfs.close(ofile) 
+0

Удивительный! Ты джентельмен! –

1

Hadoop по умолчанию сериализует объект, если вы непосредственно создаете/записываете, следовательно, вы видите дополнительные символы в файле. Однако это не тот случай, когда вы копируете текстовый файл с локального на hadoop с помощью copyFromLocal.

Сериализация - это процесс преобразования структурированных объектов в поток байтов. Это делается в основном для двух целей: 1) Для передачи по сети (межпроцессная связь). 2) Для записи в постоянное хранилище.

Вы можете десериализируются объект Hadoop, используя ниже R Код:

hfile = hdfs.file("brian.txt", "r") # read from hdfs 
file <- hdfs.read(hfile) 
file <- unserialize(file) # deserialize to remove special characters 
hdfs.close(hfile) 

Если вы планируете создать файл из R, однако, не будет читать через R, то обходной путь, чтобы избежать специальных символов будет для сохранения содержимого в локальном файле и перемещения файла в hdf. Ниже приведен код, R:

# Set environment path and load library 
Sys.setenv("HADOOP_CMD"="/usr/local/hadoop/bin/hadoop") 
library(rhdfs) 
hdfs.init() # Initialize 

text <- "Hi, This is a sample text." 
SaveToLocalPath <- "/home/manohar/Temp/outfile.txt" 
writeLines(text, SaveToLocalPath) # write content to local file 
hdfs.put(SaveToLocalPath, "/tmp") # Copy file to hdfs 
file.remove(SaveToLocalPath) # Delete from local 
+0

Thanks Manohar! Я ищу способ прочитать текстовый файл, созданный внутри R из-за пределов R без вставленных символов. Если я делаю 'copyToLocal', то' cat', я получаю ту же ошибку. Знаете ли вы какие-либо обходные пути для этого? –

+0

Брайан, я отредактировал ответ, чтобы добавить обходной путь. Надеюсь это поможет. –

+0

Еще раз спасибо Manohar! Понимаете, вы не пишете напрямую HDFS. Я бы хотел, чтобы авторы предоставили некоторое представление о формате файла. https://groups.google.com/forum/#!msg/rhadoop/586gjz5kja8/yTP_mxIRHkMJ В конечном счете, ребята, ребята, должны решить это, я полагаю. –