[英]How to calculate average by category in pyspark streaming?
我有 csv 數據作為 DStreams 來自流量計數器。 樣本如下
`Location,Vehicle,Speed,`
`tracker1,car,57,`
`tracker1,car,90,`
`tracker1,mbike,81,`
`tracker1,mbike,65,`
`tracker2,car,69,`
`tracker2,car,34,`
`tracker2,mbike,29,`
`tracker2,mbike,76,`
我想按車輛類別計算平均速度(每個位置)。
我想通過轉型來實現這一目標。 以下是我正在尋找的結果。
Location | Car | MBike
Tracker 1| 73.5 | 73
Tracker 2| 51.5 | 52.5
我不確定你到底想要什么,但如果它是按車輛、按位置的平均速度,那么你可以使用 Window function:
df = spark.createDataFrame(
[
('tracker1','car','57')
,('tracker1','car','90')
,('tracker1','mbike','81')
,('tracker1','mbike','65')
,('tracker2','car','69')
,('tracker2','car','34')
,('tracker2','mbike','29')
,('tracker2','mbike','76')
],
['Location','Vehicle','Speed']
)
from pyspark.sql import Window
import pyspark.sql.functions as F
w = Window.partitionBy("Location","Vehicle")
df_pivot = df\
.withColumn('avg_speed', F.avg(F.col('Speed')).over(w))\
.groupby('Location','Vehicle', 'avg_speed')\
.pivot("Vehicle")\
.agg(F.first('avg_speed'))\
.drop('Vehicle', 'avg_speed')
expr = {x: "sum" for x in df_pivot.columns if x is not df_pivot.columns[0]}
print(expr)
df_almost_final = df_pivot\
.groupBy("Location")\
.agg(expr)\
.orderBy('Location')
df_final = df_almost_final.select([F.col(c).alias(c.replace('sum(','').replace(')','')) for c in df_almost_final.columns])
df_final.show()
# +--------+-----+----+
# |Location|mbike| car|
# +--------+-----+----+
# |tracker1| 73.0|73.5|
# |tracker2| 52.5|51.5|
# +--------+-----+----+
您可以使用 agg() 和 mean() 函數在 PySpark Streaming 中按類別計算平均值。 為此,您需要先按類別列對數據進行分組,然后使用 agg() function 計算每組中所有值的平均值。 最后,您可以使用 mean() function 來獲取每個類別的平均值。
df.groupBy("category").agg(mean("value")).show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.