arrays - 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)
任何帮助,将不胜感激。谢谢你。
解决方案
使用 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]|
+-------+-------+-------+-------+
您还可以创建一个映射所有列的函数并执行此操作。
推荐阅读
- haskell - 为任何类型的数字定义类型类的实例
- php - 从 Woocommerce 中的自定义运费折扣中排除用户角色
- python - 如何在views.py索引函数中的django中添加我自己的python代码
- discord.js - TypeError:无法读取未定义 discord.js 的属性“发送”
- zsh - `zsh:command not found: important` 来自哪里
- firebase - allAuthenticatedUsers 用于 cloudFunction 发送推送通知:perl 客户端代码
- ios - 在segues之间存储数据
- reactjs - React Native 中的 super(props) 真的被弃用了还是只是一个 Vs 代码警告?
- numpy - .numpy() 函数有什么作用?
- excel - 为什么这个简单的 VBA 代码在 Excel 中不起作用?