2015-01-09 7 views
0

rhdfs의 hdfs.write() 명령은 유니 코드가 아닌 문자 앞에 파일을 만듭니다. 설명서에는 쓰여지는 파일 유형에 대한 설명이 없습니다.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

, 당신이 그것을 대신 R이 당신을 위해 그것을 직렬화 필요없이 원시 바이트를 취할 수 있음을 볼 수 있습니다 다음은 R 코드입니다. 그래서 본질적으로 당신은 문자를 위해 이것을 할 수 있습니다

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

굉장! 당신은 신사입니다! –

1

Hadoop은 기본적으로 직접 작성/작성하면 개체를 직렬화하므로 파일에 추가 문자가 표시됩니다. 그러나 로컬에서 hadoop으로 텍스트 파일을 복사 할 때이 경우는 그렇지 않습니다. copyFromLocal.

직렬화는 구조화 된 개체를 바이트 스트림으로 변환하는 프로세스입니다. 기본적으로 두 가지 목적으로 수행됩니다. 1) 네트워크를 통한 전송 (프로세스 간 통신). 2) 영구 저장 장치에 쓰기. 그러나 R을 통해 읽을 수없는 것

당신은 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 코드 아래 사용하여 하둡 객체를 unserialize 수 있습니다 내용을 로컬 파일에 저장하고 파일을 hdfs로 이동합니다. 당신이 source code의 hdfs.write 기능을 보면

# 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

감사합니다 Manohar! 삽입 된 문자없이 R 내에서 작성된 텍스트 파일을 R 외부에서 읽는 방법을 찾고 있습니다. 만약 내가'copyToLocal'을하고'cat'을하면 같은 에러가 난다. 그 해결 방법에 대해 알고 있습니까? –

+0

브라이언, 해결 방법을 추가하는 답변을 편집했습니다. 희망이 도움이됩니다. –

+0

다시 한 번 감사드립니다. 그래서 당신은 HDFS에 직접 쓰지 않습니다. 필자는 저자가 파일 형식에 대한 통찰력을 갖기를 바랍니다. https://groups.google.com/forum/#!msg/rhadoop/586gjz5kja8/yTP_mxIRHkMJ 궁극적으로, 혁명 사람들은 이것을 해결할 필요가 있다고 생각합니다. –