2016-11-12 110 views
2

我加載有〜500000條記錄,如本如何解決java.lang.NumberFormatException:空

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

+0

某處「St​​ring」試圖將其解析爲數字類型,但「String」格式不正確。雖然我看不到。 –

+0

我假設SQL數據庫將'ROW_ID','COLOR_CODE'或'SHADE_ID'存儲爲'varchar'而不是'int',但這只是一個猜測。 –

+0

也許與此相關:https://github.com/databricks/spark-csv/issues/192 –

回答

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() 
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/