【发布时间】:2018-08-18 14:14:57
【问题描述】:
我正在使用 Spark sql 数据帧执行 groupby 操作,然后计算每个组的数据的平均值和中位数。原始数据量约为 1 TB。
val df_result = df.filter($"DayOfWeek" <= 5).groupBy("id").agg(
count("Error").as("Count"),
avg("Error").as("MeanError"),
callUDF("percentile_approx", col("Error"), lit(0.05)).as("5thError"),
callUDF("percentile_approx", col("Error"), lit(0.5)).as("MedianError"),
callUDF("percentile_approx", col("Error"), lit(0.95)).as("95thError")).
filter($"Count" > 1000)
df_result.orderBy(asc("MeanError")).limit(5000)
.write.format("csv").option("header", "true").save("/user/foo.bar/result.csv")
当我运行该查询时,我的工作被卡住并且没有完成。我该如何调试问题?是否存在导致groupby() 卡住的关键不平衡?
【问题讨论】:
-
什么是callUDF函数?它是一个聚合函数吗?可以看看源代码吗?
-
@RameshMaharjan
org.apache.spark.sql.functions.callUDF是 spark 的内置函数 -
df.rdd.count完成了吗?如果不是,那么问题已经在 groupBy 之前了。您可以检查 SparkUI 以查看您的代码卡在哪里。我猜记忆可能是个问题。您可以尝试增加spark.sql.shuffle.partitions,这会增加您在 groupBy 期间洗牌的分区数量(默认为 200),但如果您的数据严重倾斜,这将无济于事,即一个id有太多行 -
用户定义函数
"percentile_approx"注册了吗?如果不是,那么这个 UDF 可能只在驱动程序上定义,这可能会导致在groupby期间将大量数据推回驱动程序。 -
@davidrpugh
percentile_approx是 Hive 内置聚合函数
标签: apache-spark apache-spark-sql spark-dataframe