我有一个数据框,其中数据的顺序已经正确。
现在我需要在数据帧上执行诸如lead/lag之类的窗口函数,但是根据Spark,orderBy是强制性的,它不允许我像lead(col).over()
有没有办法跳过 orderBy ,因为如果我按任何 col 排序,数据顺序将不正确。
这个逻辑也应该适用于大型数据集。
不,在 Spark 中,对于
lead
和 lag
等窗口函数,数据排序是必需的。
这是因为窗口函数对由 ORDER BY
子句定义的特定行顺序进行操作。
如果不对数据进行排序,窗口函数无法确定窗口框架中包含哪些行。
我尝试过以下方法:
from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
from pyspark.sql import SparkSession, Window
from pyspark.sql.functions import row_number, lead
schema = StructType([
StructField("name", StringType(), True),
StructField("age", IntegerType(), True),
StructField("gender", StringType(), True)
])
data = [("Rama", 25, "Female"), ("Jay", 30, "Male"), ("mahesh", 35, "Male")]
df = spark.createDataFrame(data, schema)
window = Window.orderBy("name")
df = df.withColumn("row_number", row_number().over(window))
df = df.withColumn("next_name", lead("name", 1).over(window.orderBy("row_number")))
df.show()
+------+---+------+----------+---------+
| name|age|gender|row_number|next_name|
+------+---+------+----------+---------+
| Jay| 30| Male| 1| Rama|
| Rama| 25|Female| 2| mahesh|
|mahesh| 35| Male| 3| NULL|
+------+---+------+----------+---------+
使用
row_number
窗口函数将根据窗口规范中指定的顺序为数据帧中的每一行分配一个唯一的序列号,
然后您可以执行窗口函数操作,而无需实际订购数据帧。
这种方法也适用于大型数据集。