首页 > 解决方案 > Scala:从 Spark DataFrame 中删除空数组值

问题描述

我是 Scala 的新手。现在给定一个名为 df 的 DataFrame,如下所示:

+-------+-------+-------+-------+
|Column1|Column2|Column3|Column4|
+-------+-------+-------+-------+
| [null]|  [0.0]|  [0.0]| [null]|
| [IND1]|  [5.0]|  [6.0]|    [A]|
| [IND2]|  [7.0]|  [8.0]|    [B]|
|     []|     []|     []|     []|
+-------+-------+-------+-------+

如果所有列都是空数组(第 4 行),我想删除行。

例如,我可能期望结果是:

+-------+-------+-------+-------+
|Column1|Column2|Column3|Column4|
+-------+-------+-------+-------+
| [null]|  [0.0]|  [0.0]| [null]|
| [IND1]|  [5.0]|  [6.0]|    [A]|
| [IND2]|  [7.0]|  [8.0]|    [B]|
+-------+-------+-------+-------+

我正在尝试使用 isNotNull (如val temp=df.filter(col("Column1").isNotNull && col("Column2").isNotNull && col("Column3").isNotNull && col("Column4").isNotNull).show() )但仍显示所有行。

我找到了使用来自link的 Hive UDF 的 python 解决方案,但我很难尝试转换为有效的 scala 代码。我想使用类似于以下代码的 scala 命令:

val query = "SELECT * FROM targetDf WHERE {0}".format(" AND ".join("SIZE({0}) > 0".format(c) for c in ["Column1", "Column2", "Column3","Column4"]))
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
sqlContext.sql(query)

任何帮助,将不胜感激。谢谢你。

标签: arraysscalaapache-sparkdataframeuser-defined-functions

解决方案


使用 isNotNull 或 isNull 将不起作用,因为它正在 DataFrame 中寻找“null”值。您的示例 DF 不包含空值而是空值,那里有区别。

一种选择:您可以创建一个具有数组长度的新列,并过滤数组是否为零。

  val dfFil = df
    .withColumn("arrayLengthColOne", size($"Column1"))
    .withColumn("arrayLengthColTwo", size($"Column2"))
    .withColumn("arrayLengthColThree", size($"Column3"))
    .withColumn("arrayLengthColFour", size($"Column4"))
    .filter($"arrayLengthColOne" =!= 0 && $"arrayLengthColTwo" =!= 0 
    && $"arrayLengthColThree" =!= 0 && $"arrayLengthColFour" =!= 0)
    .drop("arrayLengthColOne", "arrayLengthColTwo", "arrayLengthColThree", "arrayLengthColFour")

原DF:

+-------+-------+-------+-------+
|Column1|Column2|Column3|Column4|
+-------+-------+-------+-------+
|    [A]|    [B]|    [C]|    [d]|
|     []|     []|     []|     []|
+-------+-------+-------+-------+

新东风:

+-------+-------+-------+-------+
|Column1|Column2|Column3|Column4|
+-------+-------+-------+-------+
|    [A]|    [B]|    [C]|    [d]|
+-------+-------+-------+-------+

您还可以创建一个映射所有列的函数并执行此操作。


推荐阅读