2015-10-16 5 views
0

Я использую Spark 1.2 для обработки некоторых данных. Я создал схему, используя StructField.Apache Spark SQL NumberFormatException

val exampleSchema = StructType(Array(StructField("SerialNo",StringType,true),StructField("Date",DateType,true),StructField("Value",IntegerType,true))) 

val exampleRowRDD = rawData.map(_.split(",")).map(p => Row(p(0),repairDate(p(1)), p(2).toInt)) 


val schemaRDD = sqlContext.applySchema(exampleRowRDD, exampleSchema) 

schemaRDD.registerTempTable("ExampleTable") 

Теперь, когда я бегу запрос к таблице, я получаю эту ошибку:

java.lang.NumberFormatException: For input string: "" 
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) 
    at java.lang.Integer.parseInt(Integer.java:504) 
    at java.lang.Integer.parseInt(Integer.java:527) 
    at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:229) 
    at scala.collection.immutable.StringOps.toInt(StringOps.scala:31) 
    at $line16.$read$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$anonfun$2.apply(<console>:49) 
    at $line16.$read$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$iwC$$anonfun$2.apply(<console>:49) 
    at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) 
    at org.apache.spark.sql.columnar.InMemoryRelation$$anonfun$3$$anon$1.next(InMemoryColumnarTableScan.scala:122) 
    at org.apache.spark.sql.columnar.InMemoryRelation$$anonfun$3$$anon$1.next(InMemoryColumnarTableScan.scala:112) 
    at org.apache.spark.storage.MemoryStore.unrollSafely(MemoryStore.scala:249) 
    at org.apache.spark.CacheManager.putInBlockManager(CacheManager.scala:163) 
    at org.apache.spark.CacheManager.getOrCompute(CacheManager.scala:70) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:228) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:230) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:230) 
    at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:35) 
    at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:263) 
    at org.apache.spark.rdd.RDD.iterator(RDD.scala:230) 

Я знаю, что мои данные имеет нулевые значения, и я попытался обработать нулевые значения с опцией, некоторые , None, но затем Spark SQL не распознает тип данных. Итак, нижняя строка для моего столбца «Значение» все значения должны быть целыми, но null не может быть преобразован в целое число. Что мне делать? Пример примера примерного примера будет оценен.

ответ

0

Вы можете создать функцию, которая возвращает Option[Int] вместо метания NumberFormatException с помощью Try:

import scala.util.Try 

def parseInt(s: String): Option[Int] = Try(s.toInt).toOption 

Что вы могли бы использовать в качестве:

val bad1 = "" 
val bad2 = (Int.MaxValue + 1L).toString 
val good = "5" 

parseInt(bad1) // None 
parseInt(bad2) // None 
parseInt(good) // Some(5) 

Вам нужно будет адаптировать ваш код для обработки Option[Int] конечно.

  • Вы могли бы работать с Option[Int] в остальной части кода
  • или указать значение по умолчанию: parseInt(bad1).getOrElse(defaultValue).
+0

Спасибо, что ответили Петром. Однако я пробовал это, но при запуске запросов к искровой таблице он вызывает ошибки. 'Исключение в потоке "main" scala.MatchError: None (из класса scala.None $) \t at scala.tools.nsc.typechecker.Implicits $ ImplicitSearch.scala $ tools $ nsc $ typechecker $ Implicits $ ImplicitSearch $$ typedImplicit (Implicits.scala: 458) ' – suri

+0

Какие ошибки вы получаете? –

+0

У меня есть два файла. Файл 1 имеет нулевые значения. Я применил ваш метод для создания таблицы из файла. Затем я присоединился к двум столам. Пока что хорошо. Затем я попытался зарегистрировать выход RDD как новая таблица, и это, когда я получаю эту ошибку: - 'machineJoinedEvents.registerTempTable («machineJoinedEventsTable») ошибка: неперехваченного исключения во время компиляции: scala.MatchError scala.MatchError: Нет (из class scala.None $) Эта запись, похоже, убила компилятор. Должен ли я воспроизводить вашей сессии? Я могу перезапустить каждую строку, кроме последней. [y/n] ' – suri

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