2014-11-14 3 views
1

나는 파일에서 RDD[String]을 가지고 :RDD [String]을 RDD [(String, String)]로 변환하려면 어떻게해야합니까?

val file = sc.textFile("/path/to/myData.txt") 

MYDATA의 형식 :

>str1_name 
ATCGGKFKKVKKFKRLFFVLFLRL 
FDJKALGFJVKRIKFKVKFGKLRL 
... 
FJDLALLLGL //the last line of str1 
>str2_name 
ATCGGKFKKVKKFKRLFFVLFLRL 
FDJKALGFJVKRIKFKVKFGKLRL 
... 
FJDLALLLGL //the last line of str2 
>str3_name 
... 

어떻게 구조 RDD[(String, String)]에 파일에서 데이터를 변환해야합니까?

import org.apache.hadoop.conf.Configuration 
import org.apache.hadoop.io.{LongWritable, Text} 
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat 

val conf = new Configuration 
conf.set("textinputformat.record.delimiter", ">") 
// genome.txt contains the records provided in the question without the "..." 
val dataset = sc.newAPIHadoopFile("./data/genome.txt", classOf[TextInputFormat], classOf[LongWritable], classOf[Text], conf) 
val data = dataset.map(x=>x._2.toString) 

은의 데이터

를 살펴 보자 : 예를 들어 은
trancRDD(
(str1_name, ATCGGKFKKVKKFKRLFFVLFLRLFDJKALGFJVKRIKFKVKFGKLRL), 
(str2_name, ATCGGKFKKVKKFKRLFFVLFLRLFDJKALGFJVKRIKFKVKFGKLRL), 
... 
) 
+0

우리는 사용자 정의 하프 입력 형식을 사용하여 비슷한 작업을 수행했지만 그다지 중요하지 않습니다. 내가 너라면, 나는 입력을 Spark-friendly 형식으로 변환하는 작은 프로그램을 작성하고 싶다. – maasg

+0

원하는 변환은 현재의 "before"요소 (">"로 시작하는 이전 줄)에 따라 다르기 때문에 이전의> 줄이 파티션에 없으므로 실제로는 파티션간에 배포 할 수 없습니다. @maasg가 말했듯이, 파일을 올바른 형식으로 가져 오기위한 몇 가지 전처리가 더 좋을 것입니다. –

+0

감사합니다! @maasg Paul – fanhk

답변

1

정의 된 레코드 분리가 같이 있다면

는 ">는"이 사용자 정의 하둡 구성을 사용하여 수행 할 수있다, 위에서 언급
data.collect 
res11: Array[String] = 
Array("", "str1_name 
ATCGGKFKKVKKFKRLFFVLFLRL 
FDJKALGFJVKRIKFKVKFGKLRL 
FJDLALLLGL 
", "str2_name 
ATCGGKFKKVKKFKRLFFVLFLRL 
FDJKALGFJVKRIKFKVKFGKLRL 
FJDLALLLGL 
") 
우리는 쉽게 문자열에서 기록을 할 수

val records = data.map{ multiLine => val lines = multiLine.split("\n"); (lines.head, lines.tail)} 
records.collect 
res14: Array[(String, Array[String])] = Array(("",Array()), 
     (str1_name,Array(ATCGGKFKKVKKFKRLFFVLFLRL, FDJKALGFJVKRIKFKVKFGKLRL, FJDLALLLGL)), 
     (str2_name,Array(ATCGGKFKKVKKFKRLFFVLFLRL, FDJKALGFJVKRIKFKVKFGKLRL, FJDLALLLGL))) 

(필터를 사용하여 첫 번째 빈 레코드를 꺼내십시오 ... 독자를위한 운동)