2015-06-23 3 views
0

У меня есть следующая функция, которая отлично работает в REPL, по сути, это проверка типа данных схемы и сопоставление ее с столбцом, когда я сглаживаю файл позже и zipWithIndex:Scala Counter в Loop, вызывающем проблемы во время выполнения

//Match a Schema to a Column value 
    def schemaMatch(x: Array[String]) = { 
     var accum = 0 
     for(i <- 0 until x.length) { 
     val convert = x(i).toString.toUpperCase 
     println(convert) 
     val split = convert.split(' ') 
     println(split.mkString(" ")) 
     matchTest(split(1), accum) 
     accum += 1 
     } 
     def matchTest(y:String, z:Int) = y match{ 

     case "STRING" => strBuf += z 
     case "INTEGER" => decimalBuf += z 
     case "DECIMAL" => decimalBuf += z 
     case "DATE" => dateBuf += z 
     } 
    } 


    schemaMatch(schema1) 

ошибка я получаю:

Exception in thread "main" java.lang.NoSuchMethodError: scala.runtime.IntRef.create(I)Lscala/runtime/IntRef; 
    at com.capitalone.DTS.dataProfiling$.schemaMatch$1(dataProfiling.scala:112) 
    at com.capitalone.DTS.dataProfiling$.main(dataProfiling.scala:131) 
    at com.capitalone.DTS.dataProfiling.main(dataProfiling.scala) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:569) 
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:166) 
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:189) 
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:110) 
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala) 

линия 112:

var accum = 0 

Любые идеи, почему он больше не работает при компиляции, но работает в REPL, и как его исправить?

+0

Возможно, вы могли бы дать нам результат, когда он работал в REPL? –

ответ

1

Это трудно понять основной проблемы, вызвавшие NoSuchMethodError, с кодом, которую вы предоставили нам, но ваш метод, чтобы извлечь типы столбцов и соответствующие индексы могут быть упрощены:

def schemaMatch(schema: Array[String]) : Map[String,List[Int]] = 
    schema 
    // get the 2nd word (column type) in upper cases 
    .map(columnDescr => columnDescr.split(' ')(1).toUpperCase) 
    // combine column type with index 
    .zipWithIndex 
    // group by column type 
    .groupBy{ case (colType, index) => colType } 
    // keep only the indices 
    .mapValues(columsIndices => columsIndices.map(_._2).toList) 

который может быть используется как:

val columns = Array("x string", "1 integer", "2 decimal", "2015 date") 
val columnTypeMap = schemaMatch(columns) 
//Map(DATE -> List(3), STRING -> List(0), DECIMAL -> List(2), INTEGER -> List(1)) 

val strIndices = columnTypeMap.getOrElse("STRING", Nil) 
// List(0) 

val decimalIndices = columnTypeMap.getOrElse("INTEGER", Nil) ::: 
    columnTypeMap.getOrElse("DECIMAL", Nil) 
// List(1, 2) 
+0

Это работало как шарм и здорово видеть лучший способ справиться с этой проблемой! – theMadKing

Смежные вопросы