0

いくつかのヌル値で定義されたデータフレームがあります。一部の列は完全にNULL値です。私の場合はpysparkでヌルカラムを検出する方法

>> df.show() 
+---+---+---+----+ 
| A| B| C| D| 
+---+---+---+----+ 
|1.0|4.0|7.0|null| 
|2.0|5.0|7.0|null| 
|3.0|6.0|5.0|null| 
+---+---+---+----+ 

、私はnull値で満たされている列名のリストを返したいです。私の考えは、一定の列を検出することでした(列全体が同じnull値を含んでいるため)。

nullCoulumns = [c for c, const in df.select([(min(c) == max(c)).alias(c) for c in df.columns]).first().asDict().items() if const] 

が、これは何の定数としてNULL列を考慮しない、それが値でのみ動作しません:

これは私がそれをやった方法です。 どうすればいいですか?

答えて

3

from pyspark.sql.functions import min, max 

((min(c).isNull() & max(c).isNull()) | (min(c) == max(c))).alias(c) 

またはeqNullSafe(PySpark 2.3)を使用する条件を拡張:

(min(c).eqNullSafe(max(c))).alias(c) 
+1

@desertnaut:D –

1

一つの方法は、暗黙のうちにそれを行うには、次のようになります。そして、各列を選択してNULL値をカウントし、これを総数または行と比較してください。あなたのデータを使用し、これは次のようになります。

spark.version 
# u'2.2.0' 

from pyspark.sql.functions import col 

nullColumns = [] 
numRows = df.count() 
for k in df.columns: 
    nullRows = df.where(col(k).isNull()).count() 
    if nullRows == numRows: # i.e. if ALL values are NULL 
    nullColumns.append(k) 

nullColumns 
# ['D'] 

しかし、もっと簡単な方法があります:

:それはすべてのNULL値を持つ列に適用される関数 countDistinctは、ゼロ(0)を返すことが判明
from pyspark.sql.functions import countDistinct 

df.agg(countDistinct(df.D).alias('distinct')).collect() 
# [Row(distinct=0)] 

だから今forループが使用できます

nullColumns = [] 
for k in df.columns: 
    if df.agg(countDistinct(df[k])).collect()[0][0] == 0: 
    nullColumns.append(k) 

nullColumns 
# ['D'] 

UPDATE(コメント後):2番目の解決策ではcollectを避けることができるようです。 df.agg以来take(1)collectを交換し、安全に仕事をする、一列のみでデータフレームを返します。

nullColumns = [] 
for k in df.columns: 
    if df.agg(countDistinct(df[k])).take(1)[0][0] == 0: 
    nullColumns.append(k) 

nullColumns 
# ['D'] 
+0

@MehdiBenHamida慎重に:これはかなり速いです、唯一decim秒かかります!ここで 'collect'はあなたのデータ全体に適用されるのではなく**集約*に適用されます。おそらく、これは 'collect'の正当な使用です。 – desertnaut

+0

コレクションは集計についてですが、まだ多くのパフォーマンスを消費していることがわかります:/ –

+0

@MehdiBenHamidaおそらく、あなたが求めることはまったく些細なことではないことを理解していないかもしれません。 *あなたの行、NULLをチェックする。今、あなたが 'countDistinct'を使うことさえ幸せでないなら...(minとmaxが短い場合、 – desertnaut

関連する問題