查询另一个DataFrame查询Spark的结果

时间:2018-05-30 00:08:52

标签: python sql pandas apache-spark dataframe

为Python使用spark和Pandas库。 我基本上有以下内容:

df.groupby('sIP').agg({'duration': 'sum'}).show()

这给了我以下输出:

+---------------+------------------+                                            
|            sIP|     sum(duration)|
+---------------+------------------+
| 203.13.173.243|               0.0|
|  204.62.16.153|         17522.927|
|  203.30.177.95|             1.081|
|   56.23.191.99|           113.186|

所有不同源IP地址持续时间的总和。

我现在要做的是从该总和中获取最大值,并获取相关的源IP。所以我必须在修改后查询DataFrame(上面的查询)。

所以我试着:

df.groupby('sIP').agg({'duration': 'max'}).show()

但它仍然会查询原始DataFrame,如下所示:

+---------------+-------------+                                                 
|            sIP|max(duration)|
+---------------+-------------+
| 203.13.173.243|          0.0|
|  204.62.16.153|     1790.305|
|  203.30.177.95|        1.081|
|   56.23.191.99|       22.563|

无论如何都要覆盖数据帧状态?我看过转换但没有成功,但收集()是我调查的另一件事,但仍然没有......

我错过了什么?

提前致谢。

3 个答案:

答案 0 :(得分:0)

您可以使用sort_values + tail

df.groupby('sIP').agg({'duration': 'sum'}).sort_values('sum(duration)').tail(1)

答案 1 :(得分:0)

Scala的

df.groupBy("ip").agg(sum("duration").as("sum_duration")).agg(max("sum_duration")).show()

PySpark

import pyspark.sql.functions as F
df.groupBy("ip").agg(F.sum("duration").alias("sum_duration")).agg(F.max("sum_duration")).show()

答案 2 :(得分:0)

您需要将第一个转换保存到新的数据框,否则结果将被丢弃。

df1 = df.groupby('sIP').agg({'duration': 'max'}).toDF('sIP', 'max_duration')

然后您可以根据需要操作新的数据帧,即:

df1.sort('max_duration', ascending=False).show(1)

无论如何,您可以在没有中间数据帧的情况下进行一次转换:

df.groupby('sIP').agg({'duration': 'max'}).sort('max(duration)', ascending=False).show(1)