2014-11-14 2 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)]? Например,

trancRDD(
(str1_name, ATCGGKFKKVKKFKRLFFVLFLRLFDJKALGFJVKRIKFKVKFGKLRL), 
(str2_name, ATCGGKFKKVKKFKRLFFVLFLRLFDJKALGFJVKRIKFKVKFGKLRL), 
... 
) 
+0

Мы сделали что-то подобное, используя пользовательский формат ввода ввода-вывода, но это нетривиально. Если бы я был вами, я бы предпочел написать небольшую программу, чтобы преобразовать ввод в удобный для Spark формат. – maasg

+0

Поскольку преобразование, которое вы хотите, зависит от элементов «до» текущего (предыдущая строка, начинающаяся с «>»), на самом деле невозможно распределить это по разделам (поскольку предыдущая строка не может быть в разделе). Так как @maasg говорит, что некоторая предварительная обработка, чтобы получить файл в правильном формате, была бы лучше. –

+0

Спасибо, ребята! @maasg Paul – fanhk

ответ

1

Если есть определенный разделитель записей, как «>» было указано выше, это может быть сделано с помощью пользовательской конфигурации Hadoop:

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) 

Давайте посмотрим на данные

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))) 

(используйте фильтр, чтобы получить эту первую пустую запись ... упражнение для читателя)