Если есть определенный разделитель записей, как «>» было указано выше, это может быть сделано с помощью пользовательской конфигурации 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)))
(используйте фильтр, чтобы получить эту первую пустую запись ... упражнение для читателя)
Мы сделали что-то подобное, используя пользовательский формат ввода ввода-вывода, но это нетривиально. Если бы я был вами, я бы предпочел написать небольшую программу, чтобы преобразовать ввод в удобный для Spark формат. – maasg
Поскольку преобразование, которое вы хотите, зависит от элементов «до» текущего (предыдущая строка, начинающаяся с «>»), на самом деле невозможно распределить это по разделам (поскольку предыдущая строка не может быть в разделе). Так как @maasg говорит, что некоторая предварительная обработка, чтобы получить файл в правильном формате, была бы лучше. –
Спасибо, ребята! @maasg Paul – fanhk