簡體   English   中英

Scala - Spark:獲取包含空值的列的列名

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM