gpt4 book ai didi

apache-spark - 将可为空的列作为参数传递给 Spark SQL UDF

转载 作者:行者123 更新时间:2023-12-03 07:07:44 24 4
gpt4 key购买 nike

这是一个 Spark UDF,我用它来使用几个列来计算值。

def spark_udf_func(s: String, i:Int): Boolean = { 
// I'm returning true regardless of the parameters passed to it.
true
}

val spark_udf = org.apache.spark.sql.functions.udf(spark_udf_func _)

val df = sc.parallelize(Array[(Option[String], Option[Int])](
(Some("Rafferty"), Some(31)),
(null, Some(33)),
(Some("Heisenberg"), Some(33)),
(Some("Williams"), null)
)).toDF("LastName", "DepartmentID")

df.withColumn("valid", spark_udf(df.col("LastName"), df.col("DepartmentID"))).show()
+----------+------------+-----+
| LastName|DepartmentID|valid|
+----------+------------+-----+
| Rafferty| 31| true|
| null| 33| true|
|Heisenberg| 33| true|
| Williams| null| null|
+----------+------------+-----+

谁能解释为什么最后一行的有效列值为空?

当我检查 Spark 计划时,我发现该计划有一个 case 条件,它表示如果 column2 (DepartmentID) 为 null,则必须返回 null。

== Physical Plan ==

*Project [_1#699 AS LastName#702, _2#700 AS DepartmentID#703, if (isnull(_2#700)) null else UDF(_1#699, _2#700) AS valid#717]
+- *SerializeFromObject [staticinvoke(class org.apache.spark.unsafe.types.UTF8String, StringType, fromString, unwrapoption(ObjectType(class java.lang.String), assertnotnull(input[0, scala.Tuple2, true])._1), true) AS _1#699, unwrapoption(IntegerType, assertnotnull(input[0, scala.Tuple2, true])._2) AS _2#700]
+- Scan ExternalRDDScan[obj#698]

为什么 Spark 中会有这样的行为?
为什么只有整数列?
我在这里做错了什么,当 UDF 参数为 null 时,在 UDF 中处理 null 的正确方法是什么?

最佳答案

问题是 null 不是 scala Int 的有效值(它是支持值),但它是 String 的有效值。 Int 相当于 java int 原语并且必须有一个值。这意味着当值为 null 时无法调用 udf,因此 null 仍然存在。

有两种方法可以解决这个问题:

  1. 更改函数以接受 java.lang.Integer(它是一个对象,可以为 null)
  2. 如果您无法更改该函数,则可以使用when/otherwise 在 null 的情况下执行一些特殊操作。例如when(col("int col").isNull, someValue).otherwise(原始调用)

关于apache-spark - 将可为空的列作为参数传递给 Spark SQL UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46051881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com