2016-02-18 5 views
1

В настоящее время я новый студент Скале, глядя на Скале кодированиях помощи в разборе строки в случае класс,Scala разбор строки к случаю объекта

case class CategaryIds(id1: Long, id2: Long, id3: Long, secIds: Set[Long]) 

данные выглядят, как показано ниже представлены как свечи РД

600045,8114,31679,"{1:2:3:4}" 
600034,8114,34526, 
600056,8114,31679,"{1:2:3:4}" 

попытался ниже код, бросает исключение arrayoutofbund исключение и NumberFormat исключение

val fields = line.split(",").map(_.trim); 
CategaryIds(fields(0).toLong,fields(1).toLong,fields(2).toLong,fields(3).replace("{","").replace("}", "").split(":").map(_.toLong).toSet)} 

Если есть лучший способ достичь этого, пожалуйста, поделитесь им

+1

вы получаете arrayoutofbounds когда вы пытаетесь получить доступ к «полям (3)», когда в этом индексе нет элемента, как во втором элементе вашего RDD. –

ответ

0

Что-то вроде этого работает.

val fields = line.split(",").map(_.trim).toSeq 

val seq = if (fields.size > 3) fields(3).split("\"{:}".toCharArray).filter(_ != "").map(_.toLong).toSet else Set[Long]() 
CategaryIds(fields(0).toLong, fields(1).toLong,fields(2).toLong, seq) 

Сначала проверьте, что Set не пуст, так что вы не получаете ArrayIndexOutOfBoundsException, затем разделить на сепараторах и конвертировать их в лонги

+0

Спасибо за приведенный выше код, который работал на меня ... – prakash

+0

@prakash Добро пожаловать. Если он работает, пожалуйста, примите мой ответ – omainegra

0

Может быть Regex будет более подходящим

val r = """(\d*),(\d*),(\d*),(?:"\{(.*)\}")?""".r 

"""600045,8114,31679,"{1:2:3:4}"""" match { 
    case r(a,b,c,d) => println(s"a:$a, b:$b, c:$c, d:$d") 
    case _ => println("no match") 
} 

"""600034,8114,34526,""" match { 
    case r(a,b,c,d) => println(s"a:$a, b:$b, c:$c, d:$d") 
    case _ => println("no match") 
} 
r: scala.util.matching.Regex = (\d*),(\d*),(\d*),(?:"\{(.*)\}")? 

scala>  |  |  | a:600045, b:8114, c:31679, d:1:2:3:4 

scala>  |  |  | a:600034, b:8114, c:34526, d:null 

и вы можете использовать его

val r = """(\d*),(\d*),(\d*),(?:"\{(.*)\}")?""".r 

somelines.map{ 
    case r(a,b,c,null) => 
    CategaryIds(a.toLong, b.toLong, c.toLong, Set()) 
    case r(a,b,c,d) => 
    CategaryIds(a.toLong, b.toLong, c.toLong, d.split[":"].toSet.map(_.toLong)) 
}