Spark Java toBytes中的NPE(行。<long> getAs(&#34; value2&#34;))

时间:2017-11-23 16:31:34

标签: apache-spark

为什么以下产生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中,但不确定,可能只是更好的测试数据。

1 个答案:

答案 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)));