java - Spark SQL sql ("<some aggregate query>").first().getDouble(0) 给我不一致的结果

标签 java apache-spark hive hivecontext

我有下面的查询,它应该找到列值的平均值并返回单个数字的结果。

val avgVal = hiveContext.sql("select round(avg(amount), 4) from users.payment where dt between '2018-05-09' and '2018-05-09'").first().getDouble(0)

我在这个声明中遇到了不一致的行为。这通常会失败并出现以下错误,但是当通过 Hive 执行时它会给出非 NULL 结果。”

18/05/10 11:01:12 ERROR ApplicationMaster: User class threw exception: java.lang.NullPointerException: Value at index 0 in null
java.lang.NullPointerException: Value at index 0 in null
    at org.apache.spark.sql.Row$class.getAnyValAs(Row.scala:475)
    at org.apache.spark.sql.Row$class.getDouble(Row.scala:243)
    at org.apache.spark.sql.catalyst.expressions.GenericRow.getDouble(rows.scala:192)

我使用 HiveContext 而不是 SQLContext 的原因是后者不支持我在代码中广泛使用的一些聚合函数。

您能帮我理解为什么会出现这个问题以及如何解决吗?

最佳答案

您需要将查询分为两部分:

var result = hiveContext.sql("select round(avg(amount), 4) from users.payment where dt between '2018-05-09' and '2018-05-09'");
var first = result.first();
if (first != null && !first.isNullAt(0)) {
var avgVal = first.getDouble(0);
}

这将避免 NPE。这在列表和数组中也需要。

对于插入或更新查询,您甚至需要用 try...catch block 包围来捕获运行时异常。

关于java - Spark SQL sql ("<some aggregate query>").first().getDouble(0) 给我不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50269797/

相关文章:

java - 动画仅在第一次单击按钮时移动

scala - 使用 Pyspark 删除表

apache-spark - Spark SQL 与 Databricks SQL

java - 我应该在spark应用程序中包含hadoop-common还是hadoop-core

java - Java-GSS启动失败异常,由以下原因引起:org.apache.thrift.transport.TTransportException:GSS启动失败

hadoop - HIVE 十进制 2 精度

java - 如何在 onfocus 和 outfocus 时在 JavaFX TextField 上执行任务?

java - Spring 的 AntPathMatcher 与 linux 路径的匹配行为

java - 在struts2中使用OGNL未将请求对象传递给静态方法

python - 如何在 PySpark 中分别对多个列进行透视