Хотя остальные ответы верны (вы можете использовать свой запрос непосредственно во временном представлении или orderBy
+ limit
), похоже, ни один из них не решает вашу главную проблему:
Но в запросе Spark я не хочу выполнять упорядочение по операции, потому что размер наших данных слишком велик, поэтому это займет слишком много времени. Возможно ли в Spark сделать то же самое, не используя order by?
Давайте посмотрим, что происходит под одеялом:
df = spark.createDataFrame(
[(100, 1), (200, 2), (300, 3), (400, 4), (500, 5), (600, 6)],
("id", "timestamp"))
df.filter("timestamp < 5").orderBy(df["timestamp"].desc()).limit(1).explain()
# == Physical Plan ==
# TakeOrderedAndProject(limit=1, orderBy=[timestamp#35L DESC NULLS LAST], output=[id#34L,timestamp#35L])
# +- *(1) Filter (isnotnull(timestamp#35L) && (timestamp#35L < 5))
# +- Scan ExistingRDD[id#34L,timestamp#35L]
Как видите, сортировки вообще нет. Спарк проанализировал план, вместо полной сортировки применил TakeOrderedAndProject
. В результате он будет занимать только первое место в каждом разделе.
Операция до линейна с точки зрения количества строк, но вам не нужно беспокоиться, но полная сортировка требуется для сортировки всех записей.
Вывод? Пока предельное значение невелико, здесь не о чем беспокоиться (при больших лимитах все может стать уродливым).