2016-07-24 83 views
0

我有一個數據框,其中包含三列,timestamp, hostname, and num_denied。我想總結num_denied基於groupbytimestamp and hostname和顯示結果,其中,num_denied大於一個值(比如500000)。Pyspark:根據結果計算過濾數據

例子:

>>> df.show() 
+----------+----------+----------+ 
|  Time| Hostname|num_denied| 
+----------+----------+----------+ 
|1456855800|hostname.2|  310| 
|1456855800|hostname.0|  314| 
|1456855800|hostname.0|  256| 
|1456855800|hostname.2|  304| 

現在,當我執行 -

結果:

df.groupBy(['Time','Hostname']).agg({'num_denied':'sum'}).show() 
+----------+----------+---------------+ 
|  Time| Hostname|sum(num_denied)| 
+----------+----------+---------------+ 
|1456855800|hostname.0|  1507741| 
|1456855800|hostname.1|  1441778| 
|1456855800|hostname.2|  1428479| 
|1456855860|hostname.0|   501624| 
|1456855860|hostname.1|   504208| 
|1456855860|hostname.2|   517899| 
+----------+----------+---------------+ 

問:
你如何進一步降低上述結果表,像 Pusedo代碼df.groupBy(['Time','Hostname']).agg({'num_denied':'sum'} > 60000)這樣我們就可以得到結果lt

+----------+----------+-----------------------+ 
|  Time| Hostname|sum(num_denied) > 60000| 
+----------+----------+-----------------------+ 
|1456855800|hostname.0|  1507741  | 
|1456855800|hostname.1|  1441778  | 
|1456855800|hostname.2|  1428479  | 
+----------+----------+-----------------------+ 

基本上我想過濾聚合值,它如何過濾它?嘗試過濾器的選項很少,但不起作用。

回答

0

嘗試:

df.groupBy(['Time','Hostname']).agg({'num_denied':'sum'}).filter(df['sum(num_denied)']>6000).show() 

https://spark.apache.org/docs/1.6.1/api/python/pyspark.sql.html

濾波器(條件) - 過濾器使用給定條件的行。

df.filter(df.age > 3).collect() 
[Row(age=5, name=u'Bob')] 
+0

上面的命令拋出一個錯誤說總和(num_denied)不是數據幀(列)的一部分 - 「無法解析列名中(時間,主機名,num_denied)‘總和(num_denied)’;」。我可以將結果存儲在另一個數據框中並過濾結果。基本上df ['sum(num_denied)']不是df的一部分。任何解決方案單線執行? –