2017-09-19 8 views
0

私は、aggとcountを使用してDataFrameでいくつかのカウントを取得しようとしています。PySpark Dataframe Aggregationでnullを含むCount

from pyspark.sql import Row ,functions as F 
row = Row("Cat","Date") 
df = (sc.parallelize 
    ([ 
     row("A",'2017-03-03'), 
     row('A',None), 
     row('B','2017-03-04'), 
     row('B','Garbage'), 
     row('A','2016-03-04') 
]).toDF()) 
df = df.withColumn("Casted", df['Date'].cast('date')) 
df.show() 

enter image description here

(
df.groupby(df['Cat']) 
.agg 
(
    #F.count(col('Date').isNull() | col('Date').isNotNull()).alias('Date_Count'), 
    F.count('Date').alias('Date_Count'), 
    F.count('Casted').alias('Valid_Date_Count') 
)  
.show() 

Sample

F.countは()私の唯一の非nullの数を与えている機能。 'OR'条件を使用する以外に、NULLを含むカウントを取得する方法はありますか?

無効なカウントが機能していないようです。 &の状態が期待どおりに動作していないように見えます。

(
df 
.groupby(df['Cat']) 
.agg 
(
    F.count('*').alias('count'),  
    F.count('Date').alias('Date_Count'), 
    F.count('Casted').alias('Valid_Date_Count'), 
    F.count(col('Date').isNotNull() & col('Casted').isNull()).alias('invalid') 
)  
.show() 
) 

enter image description here

答えて

1

それは

df\ 
    .groupby(df['Cat'])\ 
    .agg ( 
     F.count('Date').alias('Date_Count'), 
     F.count('Casted').alias('Valid_Date_Count'), 
     F.sum((~F.isnull('Date')&F.isnull("Casted")).cast("int")).alias("Invalid_Date_Cound") 
    ).show() 

    +---+----------+----------------+------------------+ 
    |Cat|Date_Count|Valid_Date_Count|Invalid_Date_Cound| 
    +---+----------+----------------+------------------+ 
    | B|   2|    1|     1| 
    | A|   2|    2|     0| 
    +---+----------+----------------+------------------+ 
+0

intsumとしてブール式をキャストあなたは私を追加し、最終的なコードブロックを見ることができます。無効なエイリアスが期待した結果を得ていません。 –

+0

@Tronald Dumpあなたの意図する出力は何ですか? – MaFF

+0

投稿の最後に目的の出力が追加されます。 –

関連する問題