我正在运行带有Spark 2.0的PySpark来聚合数据。 以下是Spark中收到的原始数据帧(df)。
DeviceID TimeStamp IL1 IL2 IL3 VL1 VL2 VL3
1001 2019-07-14 00:45 2.1 3.1 2.25 235 258 122
1002 2019-07-14 01:15 3.2 2.4 4.25 240 250 192
1003 2019-07-14 01:30 3.2 2.0 3.85 245 215 192
1003 2019-07-14 01:30 3.9 2.8 4.25 240 250 192
现在,我想通过groupby
应用DeviceID
逻辑。 StackOverflow中有几篇文章。特别是,This和this链接是关注点。在这些帖子的帮助下,我创建了以下脚本
from pyspark.sql import functions as F
groupby = ["DeviceID"]
agg_cv = ["IL1","IL2","IL3","VL1","VL2","VL3"]
func = [min,max]
expr_cv = [F.f(F.col(c)) for f in func for c in agg_cv]
df_final = df_cv_filt.groupby(*groupby).agg(*expr_cv)
上面的代码显示错误为
Columns are not iterable
无法理解为什么会出现此类错误。当我使用以下代码
from pyspark.sql.functions import min, max, col
expr_cv = [f(col(c)) for f in func for c in agg_cv]
然后上面的代码运行正常。
我的问题是:如何解决上述错误。
答案 0 :(得分:1)
尝试
func = [F.min,F.max]
agg_cv = ["IL1","IL2","IL3","VL1","VL2","VL3"]
expr_cv = [f(F.col(c)) for f in func for c in agg_cv]
df_final = df1.groupby(*groupby).agg(*expr_cv)
这应该有效。
+--------+---------+--------+--------+--------+--------+--------+---------+--------+--------+--------+--------+--------+
|DeviceID|min( IL1)|min(IL2)|min(IL3)|min(VL1)|min(VL2)|min(VL3)|max( IL1)|max(IL2)|max(IL3)|max(VL1)|max(VL2)|max(VL3)|
+--------+---------+--------+--------+--------+--------+--------+---------+--------+--------+--------+--------+--------+
| 1003| 3.2| 2.0| 3.85| 240| 215| 192| 3.9| 2.8| 4.25| 245| 250| 192|
| 1002| 3.2| 2.4| 4.25| 240| 250| 192| 3.2| 2.4| 4.25| 240| 250| 192|
| 1001| 2.1| 3.1| 2.25| 235| 258| 122| 2.1| 3.1| 2.25| 235| 258| 122|
+--------+---------+--------+--------+--------+--------+--------+---------+--------+--------+--------+--------+--------+```