当我在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条答案
按热度按时间pxy2qtax1#
如果您的逻辑要求使用order by WITHON partition子句,可能是因为您没有其他要分区的内容,或者它对所使用的窗口函数没有意义,您可以添加如下所示的伪值-
.withColumn("id", explode(typedLit((1 to 100).toList)))
这将为原始Dataframe中的每一行创建一个值为1到100的id字段,并在partition by子句(partition by id)中使用该字段,它将启动100个任务。它将创建的总行数将是当前行*100。请确保删除id字段并对结果执行distinct。dgiusagp2#
警告就是这么说的。一般来说,当你使用一个窗口函数时,你会先按某个列进行分区,然后再按顺序进行排序。因此,例如,如果您有一个用户的日志,您可以按该用户进行分区,然后按时间排序,这将分别为每个用户进行排序。
如果您还没有分区,那么您将对整个Dataframe进行排序。这基本上意味着只有一个分区。所有Dataframe中的所有数据都将移动到单个分区并进行排序。
这将是缓慢的(你洗牌一切,然后排序一切),更糟的是,这意味着所有的数据需要在一个单一的分区,这是不可伸缩的。
您可能应该查看一下您的逻辑,以确保确实需要对所有内容进行排序,而不是以前按某个内容进行分区。