[英]Scala - Spark : Get the column names of the columns that contains null values
情況如下:我有一個 DataFrame,我想在其中獲取包含一個或多個空值的列的列名。
到目前為止我所做的:
val columnsContainsNull = df.select(mandatoryColumns: _*)
.columns
.map(column => if(df.select(column).filter(col(column).isNull).count > 0) column)
當我執行該代碼時,由於我不知道的原因,它變得非常慢。 你有什么線索我怎樣才能讓它工作,我怎樣才能優化它?
在您的代碼中,您將為每一列執行一個操作,這可能會導致執行速度變慢,並且在數據范圍更廣的情況下更是如此。
您可以使用以下方法計算
使用createOrReplaceTempView
將 DF 注冊為表
df.createOrReplaceTempView("TEMP_TABLE")
然后在上面執行下面的SQL語句。
SELECT
SUM(case when col1 is null then 1 else 0 end) as col1_isnull,
SUM(case when col2 is null then 1 else 0 end) as col2_isnull,
....
....
SUM(case when coln is null then 1 else 0 end) as coln_isnull
from
TEMP_TABLE
如果您有很多列,您還可以使用以下方法以編程方式生成語句:
val query = df2.columns.map{ c =>
s"sum(case when $c is null then 1 else 0 end) as ${c}"
}.mkString("SELECT ", ",", " FROM TEMP_TABLE")
然后,一旦您使用
val nullCounts = spark.sql(query)
您應該有一個如下所示的數據框:
+----+----+----+----+
|col1|col2|....|colN|
+----+----+----+----+
| 0| 1| | 1|
+----+----+----+----+
然后,您可以使用以下方法提取具有空值的列名稱:
val paired = nullCounts.first
nullCounts.columns
.zipWithIndex.map{
case(k,v) => (k, paired.getLong(v))
}
.filter(_._2 > 0 )
.map(_._1)
並且您應該有一個Array[String]
,其中包含具有NULL
值的列名。
// Array[String] = Array(col2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.