我有一個包含 2 列(CPID和PluginDuration)的 spark 資料框。我需要為資料框中的每個找到最大值pluginDuration和平均值。pluginDurationCPID
為在行CPID AN04773下方回傳的資料幀回傳的行:
df.filter('CPID = "AN04773"').show(10)
Result:
------- --------------
| CPID|PluginDuration|
------- --------------
|AN04773| 1.933333333|
|AN04773| 13.03444444|
|AN04773| 9.2875|
|AN04773| 20.50027778|
------- --------------
當我做groupBy對PID資料幀尋找的列max和avg插件時間如下,我發現了一些回傳的PID的最大值并不如預期。例如,for PID AN04773(與PID我用來顯示來自原始 df 的行相同)。最大值pluginDuration應該是20.50027778但從下面代碼的結果來看,最大值9.2875是不正確的。
from pyspark.sql import functions as F
fdf = df.groupBy('CPID').agg(F.max('PluginDuration').alias('max_duration'),F.avg('PluginDuration').alias('avg_duration'))
fdf.filter('CPID = "AN04773"').show()
Result:
------- ------------ --------------
| CPID|max_duration| avg_duration|
------- ------------ --------------
|AN04773| 9.2875|11.18888888825|
------- ------------ --------------
想知道為什么它沒有按預期運行。
uj5u.com熱心網友回復:
發生錯誤的計算PluginDuration是因為未定義為數字資料型別,而是定義為字串列。您所要做的就是將PluginDuration列轉換為數字型別(雙精度、浮點數等)。
這是您的問題(在 中復制scala但在 中作業相同PySpark):
val data = Seq(("AN04773", "1.933333333"), ("AN04773", "13.03444444"), ("AN04773", "9.2875"), ("AN04773", "20.50027778")).toDF("id", "value")
data.groupBy("id").agg(functions.max("value"), avg("value")).show
// output:
------- ---------- --------------
| id|max(value)| avg(value)|
------- ---------- --------------
|AN04773| 9.2875|11.18888888825|
------- ---------- --------------
但是在將value列轉換為Double資料型別后,我們得到了正確的計算值:
data.withColumn("value",col("value").cast("double")).groupBy("id").agg(functions.max("value"), avg("value")).show
// output:
------- ----------- --------------
| id| max(value)| avg(value)|
------- ----------- --------------
|AN04773|20.50027778|11.18888888825|
------- ----------- --------------
uj5u.com熱心網友回復:
由于列中沒有定義資料型別,因此 Scala 將其視為字串,并且字串 9 大于 2 ,因此最大值為 9.285
注意:如果您將 pyspark 中的資料型別轉換為字串,您將獲得與在 Scala 中獲得的結果相同的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345656.html
上一篇:迭代獲取子串
