我正在加载一个有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
可能您的csv中有null/空值,或者其他无法解析为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()
逗号后面的空格可能是问题所在。你的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/