scala - 使用 spark 将 null 设置为 Hive 表中数字数据类型的值

标签 scala hadoop apache-spark spark-dataframe

我正在寻找一种解决方案,我需要使用 Spark 在其中没有值的数字字段中填充 null。我写的代码如下:

val myDF = sqlContext.sql("from mystg.my_acct_table select id,amt,tot_amt where id=12345")
myDF.map(row => {val row1 = row.getAs[Double]("tot_amt")
      val my_tot_amt = {
          if(row1.isNaN())
              null.asInstanceOf[Double]
          else
              Math.abs(row1.toDouble)
        }
    Row(row(0),row(1),my_tot_amt)
   })

我还尝试将上述逻辑放在 Row(row(0),row(1),my_tot_amt) 中。

  Row(row(0),row(1),(if(row1.isNaN())
                    null.asInstanceOf[Double]
                else
                    Math.abs(row1.toDouble)))

但是我得到的输出是 | 8687992537618075 | 1163.35 | 0.0 |

预期的输出是 | 8687992537618075 | 1163.35 |空 |

最佳答案

null.asInstanceOf[Double]0.0。只是不要投它:

val my_tot_amt = if(row1.isNaN())
  null
else
  Math.abs(row1.toDouble)

应该有效(这使得 my_tot_amt Any 的类型;val my_tot_amt: java.lang.Double = ... 更精确,但在这种特定情况下不应该是必需的)。

此外,我认为您会得到 0.0,其中 row("tot_amt") 已经是 null;这是故意的吗?

关于scala - 使用 spark 将 null 设置为 Hive 表中数字数据类型的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40292070/

相关文章:

scala - Slick - 创建投影中不存在的列

java - 如何使用 Java API 将文本文件、图像存储到 Apache Spark 中?

hadoop - 在配置单元外部表中使用组分隔符(GS)作为分隔符

hadoop - 在 hadoop 多节点集群上启动 HDFS 守护程序时出错

Hadoop namenode 无法退出安全模式

java - 为什么 Spark 的 Word2Vec 返回一个 vector ?

java - spark 返回错误 libsnappyjava.so : failed to map segment from shared object: Operation not permitted

sql-server - H2数据库查询中的If-Else条件

java - Scala 方法中出现抽象错误

scala - 如何在 Scala 中使用 IO monad 实现短路