告诉pyspark已知的顺序
我有一个巨大的数据集,其中包含一个row_id,因此我知道row_id是单调递增的,并且数据分区是按这个row_id排序的 现在我想使用lag()函数移动一些列:告诉pyspark已知的顺序,pyspark,data-partitioning,Pyspark,Data Partitioning,我有一个巨大的数据集,其中包含一个row_id,因此我知道row_id是单调递增的,并且数据分区是按这个row_id排序的 现在我想使用lag()函数移动一些列: window = sql.Window.partitionBy().orderBy('row_id') df = df.withColumn('shifted_my_value', F.lag(df.my_value).over(window)) 但是,pyspark不知道数据已经按行id排序,希望分析/重新排列整个数据集(尽管我知
window = sql.Window.partitionBy().orderBy('row_id')
df = df.withColumn('shifted_my_value', F.lag(df.my_value).over(window))
但是,pyspark不知道数据已经按行id排序,希望分析/重新排列整个数据集(尽管我知道这将是一个noop)
有没有办法告诉spark我的数据已经按行id排序,它应该只移动我的值中的值而不尝试乱序。一个选项可能就是不按窗口中的行排序-
window = sql.Window.partitionBy().orderBy('select 1')
df = df.withColumn('shifted_my_value', F.lag(df.my_value).over(window))
我不确定在pyspark中它会像这样或那样工作-
window = sql.Window.partitionBy().orderBy('(select 1)')
df = df.withColumn('shifted_my_value', F.lag(df.my_value).over(window))
df.registerTempTable('df')
spark.sql('select LAG(df.my_value) OVER (order by (select 1)) FROM df' )
在SQL中,它可以这样工作-
window = sql.Window.partitionBy().orderBy('(select 1)')
df = df.withColumn('shifted_my_value', F.lag(df.my_value).over(window))
df.registerTempTable('df')
spark.sql('select LAG(df.my_value) OVER (order by (select 1)) FROM df' )
我担心最后一条命令是“AssertionError:col应该是Column”。前两个抱怨“选择1”不是列。对不起,我忘记在我的sql查询中添加来自df的
。它现在可能可以工作了。是的,我就是这么想的,所以我添加了它,它给出了“AssertionError:col应该是Column”。我还想知道partitionBy()
参数。如果我的数据集很大,我不能将所有数据放在同一个分区中,对吗?你确定select 1
真的保持了原始顺序吗?