在SparkSQL数据帧中使用窗口函数时出现警告消息

时间:2016-12-20 06:33:08

标签: hive apache-spark-sql

当我在SparkSQL中使用window函数时,我收到以下警告消息。任何人都可以让我知道如何解决这个问题。

警告讯息: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.

我的代码: def calcPrevBrdrx(df: DataFrame): DataFrame = { val w = Window.orderBy("existing_col1") df.withColumn("new_col", lag("existing_col2", 1).over(w)) }

2 个答案:

答案 0 :(得分:0)

警告正是它所说的。通常,当您使用窗口函数时,您将首先按某些列进行分区,然后才进行排序。因此,例如,如果您有用户的日志,您可以按用户进行分区,然后按时间排序,这将分别为每个用户进行排序。

如果到那时你还没有分区,那么你将对整个数据框进行排序。这基本上意味着你有一个分区。来自所有数据框的所有数据都将移动到该单个分区并进行排序。

这会很慢(你正在改变一切,然后对所有东西进行排序),更糟糕的是,这意味着你的所有数据都需要适合不可扩展的单个分区。

你应该看看你的逻辑,以确保你真的需要对所有东西进行排序,而不是之前通过某种方式进行分区。

答案 1 :(得分:-1)

如果您的逻辑要求使用无分区子句的order by,可能是因为您没有其他要分区的内容,或者对使用的window函数没有意义,则可以添加如下所示的虚拟值-

.withColumn("id", explode(typedLit((1 to 100).toList)))

这将为原始数据帧中的每一行创建一个id字段,其值在1到100之间,并在partition by子句(partition by id)中使用它,它将启动100个任务。它将创建的总行数为当前行*100。请确保删除id字段并在结果上做不同。