如何解决java.lang.NumberFormatException:null

时间:2016-11-12 14:22:48

标签: scala apache-spark apache-spark-sql

我正在加载一个包含约500,000条记录的文件,例如

ROW_ID, COLOR_CODE, SHADE_ID
21, 22, 321
23, 31, 321

我像这样加载它:

 val colorSchema = StructType(Array(
         StructField("ROW_ID", IntegerType, true),
         StructField("COLOR_CODE", IntegerType, true),
         StructField("SHADE_ID", IntegerType, true)

     def makeSchema(filename:String, tableName:String,
         tableSchema:StructType,uri:String){

         val table = spark.read.
           format("com.databricks.spark.csv").
           option("header", "true").
           schema(tableSchema).load(uri+filename).cache()
         table.registerTempTable(tableName.toUpperCase)
       }

makeSchema("colors.csv","colors",colorSchema,"s3://bucket/")

上面的代码运行正常。但是,当我运行以下查询时,我收到错误java.lang.NumberFormatException: null

val r = spark.sql("select * from colors where COLOR_CODE = 22").take(1)

我做错了什么?我怎样才能有效地发现这个问题呢?我已经直观地扫描了文件,看看COLOR_CODE是否缺少值,但我看不到任何视觉效果......

更新

我已经问了一个单独的问题,进一步缩小了问题的范围。 CSV现在只有1行,我仍然得到相同的错误。 https://stackoverflow.com/questions/40564201/how-to-resolve-java-lang-numberformatexception-null-in-spark-sql

2 个答案:

答案 0 :(得分:3)

也许你的csv中有null / empty-values,或者其他无法解析为int的字符串。

如果问题是使用空值,您可以尝试:

val table = spark.read.
           format("com.databricks.spark.csv").
           option("header", "true").
           option("nullValue","null").
           option("treatEmptyValuesAsNulls,","true").
           schema(tableSchema).load(uri+filename).cache()

答案 1 :(得分:2)

逗号之后的那些空格可能就是问题所在。你的NFE看起来像这样吗?

Caused by: java.lang.NumberFormatException: For input string: " 22"

当我重新创建你的问题时,我发生了什么。以下是解决问题的原因:

    format("com.databricks.spark.csv").
    option("header", "true").
    option("parserLib", "UNIVOCITY").
    option("ignoreLeadingWhiteSpace", "true").

我相信你需要下载univocity jar。见http://www.univocity.com/