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

Hive 在SparkSQL数据帧中使用窗口函数时出现警告消息,hive,apache-spark-sql,Hive,Apache Spark Sql,我在SparkSQL中使用窗口函数时收到以下警告消息。任何人都可以让我知道如何解决这个问题 警告信息: 没有为窗口操作定义分区!将所有数据移动到单个分区,可能会导致性能严重下降。 我的代码: def calcPrevBrdrx(df:DataFrame):DataFrame={ val w=Window.orderBy(“现有列1”) df.带列(“新列”,滞后(“现有列2”,1)。超过(w)) } 警告正是它所说的。通常,当您使用窗口函数时,您将首先按某个列进行分区,然后才按顺序进行排序。因此

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

警告信息:

没有为窗口操作定义分区!将所有数据移动到单个分区,可能会导致性能严重下降。

我的代码:

def calcPrevBrdrx(df:DataFrame):DataFrame={
val w=Window.orderBy(“现有列1”)
df.带列(“新列”,滞后(“现有列2”,1)。超过(w))
}

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

如果到目前为止还没有分区,那么将对整个数据帧进行排序。这基本上意味着您只有一个分区。所有数据帧中的所有数据都将移动到单个分区并进行排序

这将是缓慢的(您正在洗牌所有内容,然后对所有内容进行排序),更糟糕的是,这意味着您的所有数据都需要放在一个不可扩展的分区中


您可能应该查看一下您的逻辑,以确保您确实需要对所有内容进行排序,而不是以前按某个内容进行分区。

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

.withColumn(“id”,explode(键入dlit((1到100).toList))


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

基本上我正在添加一个新列(新列)通过使用窗口滞后函数,与“现有列2”相比,这只是一个向下滑动的1行。我可以在新数据框中看到新列“new\u col”按预期正确创建。但我收到了如上所述的警告消息。是的,我试图通过窗口执行此操作。orderBy(“existing_col1”)。partitionBy(“existing_col2”,“existing_col3”)是的,我试图通过窗口执行此操作。orderBy(“existing_col1”)。partitionBy(“existing_col2”,“existing_col3”)但是我要添加的新字段“new_col”对于所有行都将变为null。如果按两列进行分区,则会按元组对数据进行排序。如果每个元组只有一个值,您将得到null(因为没有延迟)。由于您试图查找列“existing\u col2”的延迟,我会这样做:Window.partitionBy(“existing\u col2”).orderBy(“existing\u col1”)