为什么以下产生NPE?
final SparkSession spark = SparkSession.builder()
.appName(" test")
.getOrCreate();
spark.createDataFrame(singletonList(new GenericRow(new Object[] { 1L, null, 3L })),
new StructType(new StructField[] { DataTypes.createStructField("value1", DataTypes.LongType, true),
DataTypes.createStructField("value2", DataTypes.LongType, true),
DataTypes.createStructField("value3", DataTypes.LongType, true)}))
.foreach((ForeachFunction<Row>) row -> {
System.out.println("###" + row.getAs("value1"));
System.out.println(row.<Long>getAs("value2"));
System.out.println(toBytes(row.<Long>getAs("value2")));
System.out.println("###" + row.getAs("value3"));
});
我认为这不会发生在Spark 1.6中,但不确定,可能只是更好的测试数据。
答案 0 :(得分:1)
所以行
System.out.println(toBytes(row.<Long>getAs("value2")));
这条线
row.<Long>getAs(“value2”))
返回null“Long
”对象
但是
toBytes(long l)
想要一个“长”,所以java将Long解包为null long =&gt; NPE如this answer所示。
为了防止这种情况,我们可以使用Java Optional
toBytes(Optional.ofNullable(row.<Long>getAs(name)).orElse(0L)));