Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Spark UDF没有将列值从null更改为0_Scala_Apache Spark_Apache Spark Sql_Spark Streaming - Fatal编程技术网

Scala Spark UDF没有将列值从null更改为0

Scala Spark UDF没有将列值从null更改为0,scala,apache-spark,apache-spark-sql,spark-streaming,Scala,Apache Spark,Apache Spark Sql,Spark Streaming,正在尝试使用下面的UDF将数据帧中的null替换为0。 在我可能出错的地方,代码似乎直截了当,但没有按预期工作 我试图创建一个UDF来替换任何值为null的列中的0 提前谢谢大家 //imports object PlayGround { def missingValType2(n: Int):Int = { if(n == null){ 0 }else{ n } } def main(args: Array[String]): Un

正在尝试使用下面的UDF将数据帧中的null替换为0。 在我可能出错的地方,代码似乎直截了当,但没有按预期工作

我试图创建一个UDF来替换任何值为null的列中的0

提前谢谢大家

//imports

object PlayGround {
def missingValType2(n: Int):Int = {
    if(n == null){
      0
    }else{
      n
    }
  }

   def main(args: Array[String]): Unit = {

    Logger.getLogger("org").setLevel(Level.ERROR)
    val spark = SparkSession
      .builder()
      .appName("PlayGround")
      .config("spark.sql.warehouse.dir", "file:///C:/temp")
      .master("local[*]")
      .getOrCreate()

    val missingValUDFType2 = udf[Int, Int](missingValType2)

     val schema = List(
      StructField("name", types.StringType, false),
      StructField("age", types.IntegerType, true)
    )

    val data = Seq(
      Row("miguel", null),
      Row("luisa", 21)
    )
    val df = spark.createDataFrame(
      spark.sparkContext.parallelize(data),
      StructType(schema)
    )
    df.show(false)
    df.withColumn("ageNullReplace",missingValUDFType2($"age")).show()

  }
}

/**
  * +------+----+
  * |name  |age |
  * +------+----+
  * |miguel|null|
  * |luisa |21  |
  * +------+----+
  *
  * Below is the current output.
  * +------+----+--------------+
  * |  name| age|ageNullReplace|
  * +------+----+--------------+
  * |miguel|null|          null|
  * | luisa|  21|            21|
  * +------+----+--------------+*/

预期产出:

 * +------+----+--------------+
  * |  name| age|ageNullReplace|
  * +------+----+--------------+
  * |miguel|null|             0|
  * | luisa|  21|            21|
  * +------+----+--------------+

不需要自定义项。您可以应用于DataFrame中特定于类型的列的列表,如下所示:

import org.apache.spark.sql.functions._
import spark.implicits._

val df = Seq(
  ("miguel", None), ("luisa", Some(21))
).toDF("name", "age")

df.na.fill(0, Seq("age")).show
// +------+---+
// |  name|age|
// +------+---+
// |miguel|  0|
// | luisa| 21|
// +------+---+

您可以使用WithColumn和when条件,如下所示 代码没有经过测试

df.withColumn("ageNullReplace", when(col("age").isNull,lit(0)).otherwise(col(age)))
在上述代码中,除此之外,仅供参考


希望这能有所帮助

为什么要尝试使用自定义项?您可以在With列中使用when来执行相同的操作。如果你有一个本机函数可以做同样的事情,@user2315840谢谢你的回复,是的,我可以做到。我阅读了这一部分的用户定义函数,我认为这是不可取的。让我快速尝试你的解决方案。你好,利奥,谢谢你。没有人推断为空吗?我想将值为null的年龄替换为0。或者一些随机数。另外,我在这里学到了一个教训:使用“!=”比较Int和Null类型的值或者,如果发生!=如果==,则为false。如果(n!=null){并且还以sql方式执行了类似的操作:spark.sql(“选择*,年龄为null时的大小写为'0',否则年龄将作为来自df2的列外数据结束”).show()Spark中SQL的
case when/then/else/end
的等价性是
when/else
,这是另一个答案所建议的。另一个选项是使用
coalesce
,如
df.withColumn(“age”,coalesce($“age”,lit(0)))
。尽管如此,建议的
na.fill
方法提供了将
null
替换同时应用于多个列的灵活性。是的,但当我使用上述解决方案时,它肯定会工作,但对我来说,df.withColumn(“ageNullReplace”,when(col(“age”).isNull,functions.lit(0))。否则(col(“age”))-出错无法解析符号when.Hey user2315840,我尝试了完全相同的方法:df.withColumn(“ageNullReplace”,when(col(“age”).isNull,functions.lit(0))。否则(col(“age”)),但关键字“when”无法解析。能否导入org.apache.spark.sql.functions_