2017-08-02 41 views
2

我想過濾一個Spark DataFrame(v。1.5.0)並看到一個特殊的結果。首先結果PySpark平等過濾器問題

df.groupby('behavior').count().show() 
+---------+-------+ 
| behavior| count| 
+---------+-------+ 
| Bought|1582345| 
| Looked|2154789| 
+---------+-------+ 

這與我的數據框中的行數一致。另外,我們看到該列中只有兩個「行爲」(「買」和「看」)。這是事情變得奇怪的地方。

df[df['behavior']=='Bought'].count() 
1025879 
df[df['behavior']=='Looked'].count() 
698742 

發生了什麼事?數據框的其他行在哪裏去了?最後,爲了讓事情變得更加陌生,使用isin()方法提供了正確的結果。

df[df['behavior'].isin(['Bought'])].count() 
1582345 
df[df['behavior'].isin(['Looked'])].count() 
2154789 

我不知道這裏發生了什麼。我會期望這兩個過濾器至少能夠返回一致的結果(錯誤或者兩者都是正確的)。任何幫助將不勝感激!

編輯

運行下面的過濾操作如下建議,所有的結果與不正確的答案是一致的。

df.filter(df['behavior']=='Bought').count() 
1025879 
df.filter(df.behavior=='Bought').count() 
1025879 
df.filter(F.col('behavior')=='Bought').count() 
1025879 

所以看起來平等檢查是什麼錯。有趣的是,isin()功能似乎仍然有效。我本來以爲isin()在幕後使用了相等檢查,但如果是這樣,我不知道它爲什麼會返回不同的結果。

回答

0

而不是做

df[df['behavior']=='Bought'].count() 

嘗試

df.filter(df.behavior == 'Bought').count() 

用於查詢的其餘部分做。

0

df [df ['behavior'] =='Bought']。count()對Pandas很有效。

爲了使列在Pyspark等同,你可以嘗試下面的選項。

  1. df.filter(df.behavior == '購買')。COUNT()
  2. df.filter(DF [ 「行爲」] == '購買')。COUNT()
  3. 從pyspark.sql.functions導入山坳 df.filter(COL( 「行爲」)== '買')。COUNT()

希望這有助於。

問候,

Neeraj