从行中读取列时出现NullPointerException

问题描述 投票:2回答:2

用于从行读取值的以下Scala(Spark 1.6)代码在值为null时失败并带有NullPointerException

val test = row.getAs[Int]("ColumnName").toString

虽然这很好

val test1 = row.getAs[Int]("ColumnName") // returns 0 for null
val test2 = test1.toString // converts to String fine

是什么导致NullPointerException以及处理此类案件的推荐方法是什么?

PS:从DataFrame获取行如下:

val myRDD = myDF.repartition(partitions)
  .mapPartitions{ rows => 
    rows.flatMap{ row =>
      functionWithRows(row) //has above logic to read null column which fails
    }
  }

functionWithRows然后上面提到NullPointerException

MyDF架构:

root
 |-- LDID: string (nullable = true)
 |-- KTAG: string (nullable = true)
 |-- ColumnName: integer (nullable = true)
scala apache-spark spark-dataframe apache-spark-1.6
2个回答
1
投票

getAs定义为:

def getAs[T](i: Int): T = get(i).asInstanceOf[T]

当我们执行toString时,我们调用不依赖于类型的Object.toString,因此编译器会删除asInstanceOf[T],即

row.getAs[Int](0).toString -> row.get(0).toString

我们可以通过编写一个简单的scala代码来确认:

import org.apache.spark.sql._

object Test {
  val row = Row(null)
  row.getAs[Int](0).toString
}

然后编译它:

$ scalac -classpath $SPARK_HOME/jars/'*' -print test.scala
[[syntax trees at end of                   cleanup]] // test.scala
package <empty> {
  object Test extends Object {
    private[this] val row: org.apache.spark.sql.Row = _;
    <stable> <accessor> def row(): org.apache.spark.sql.Row = Test.this.row;
    def <init>(): Test.type = {
      Test.super.<init>();
      Test.this.row = org.apache.spark.sql.Row.apply(scala.this.Predef.genericWrapArray(Array[Object]{null}));
      Test.this.row().getAs(0).toString();
      ()
    }
  }
}

所以正确的方法是:

String.valueOf(row.getAs[Int](0))

0
投票

为了避免空值,更好的做法是在检查之前使用isNullAt,正如documentation建议的那样:

<T> T getAs(int i)

返回位置i的值。对于原始类型,如果value为null,则返回特定于原语的“零值”,即。 0Int - 使用isNullAt确保该值不为null

但我同意这种行为令人困惑。

相关问题

从 npgsql 中的流读取时出现异常

启用辅助功能与 Jetpack Compose 和 AndroidView 的结合导致 onInitializeAccessibilityNodeInfo 中的 NullPointerException

JTable自动读取空值问题

C# csvhelper 写单独的行

无法读取未定义的属性(读取“订阅”)- React redux 工具包

如何在 Linux 中运行 fastq 屏幕

在打字稿中读取配置时是否可以将对象的键作为动态字符串传递

无法从 com.android.aaptcompiler 中提取资源

Goroutine 导致 EKS Pod 中出现分段错误

尝试在 zip 文件中并行处理每个单独的文件类型时出现文件头损坏错误

通过 REST API,从 Javascript 中的 Firebase 云函数中对 Firebase 实时数据库进行经过身份验证的浅层读取

smtp.office365.com 发送邮件失败。无法从传输连接读取数据:net_io_connectionclosed

DragNDrop Pan 库 -> 无法读取未定义的属性(读取“更新”);

获取VueGoodTable库的按钮点击行索引

日期/时间字段值超出范围:在 POSTGRESQL 中使用 \COPY 时出现“0000-00-00 00:00:00”

无法从 selenium java 中的 csv/excel 文件读取更新数据

尝试在 python 中读取我的 CSV 文件时出错

如何在java中测试从excel文件中读取数据的方法?

如何使用下面的类从web服务中动态读取下面给出的JSON数据,并为收到的数据创建水平列表视图。

使用 AWS Lambda 和 DynamoDB 进行网络抓取

热门问答
最新问题