2015-10-12 5 views
0

Я сопоставляю данные, взятые из текстового файла. Текстовый файл должен иметь 5 столбцов. напримерКак преодолеть java.lang.ArrayIndexOutOfBoundsException error

29000000 1 0 2013 1 single-sex 
29000000 1 0 2013 1 education 
29000000 1 0 2013 1 and 
29000000 1 0 2013 1 the 
29000000 1 0 2013 1 brain 

В моем процессе мне нужны только те значения, которые появляются в 0-м и 5-м столбцах. Таким образом, чтобы получить те, которые я написал следующее:

val emp = 
    sc.textFile("\\.txt") 
    .map{line => val s = line.split("\t"); (s(5),s(0))} 

Однако, вполне возможно, что иногда пятая колонна не существует для некоторых строк, и я получаю

15/10/12 17:19:33 INFO TaskSetManager: Затерянный задача 27,0 на стадии 0.0 (TID 27) на локальном хосте исполнителя: java.lang.ArrayIndexOutOfBoundsException (5)

Так что на моем картографировании, как я должен написать, если условие, если s (5) существует или нет ?

+3

Что требует бизнес-логика вашего приложения в таком случае? Я имею в виду, следует ли игнорировать эти записи или вести себя по-другому? – mgaido

+3

Вы, кажется, знаете, что массив основан на нуле, а так как их пять элементов, это означает, что индексы «0, 1, 2, 3, 4». 5 означает шестой ряд. – AlphaModder

+0

В моем посте есть 6 полей. Бериллий хорошо работает. –

ответ

6

Вы можете добавить filter() между:

val rdd = 
    sc.textFile("...").map(_.split("\t")).filter(_.size > 5).map(a => (a(0), a(5))) 

Другой вариант использования flatMap (в сочетании с извлечением «на лету»):

val rdd = sc.textFile("...").flatMap { l => 
    l.split("\t") match { 
    case Array(x: String, _, _, _, _, y: String) => Some((x, y)) 
    case _ => None 
    } 
} 

условие может быть выражено с охрана также (вместе с образцом, соответствующим классу Array[String]:

val rdd = sc.textFile("...").flatMap { l => 
    l.split("\t") match { 
    case a: Array[String] if a.size > 5 => Some((a(0), a(5))) 
    // Only one column, provide a default for the other 
    case a: Array[String] if a.size == 1 => Some((a(0), "default value")) 
    // Ignore everything else 
    case _ => None 
    } 
} 

В случае flatMap вы можете обрабатывать любое количество несоответствующих линий в виде отдельных случаев.