如何实现spark sql分页查询

sim*_*yun 10 apache-spark apache-spark-sql

有没有人如何在spark sql查询中进行分页?

我需要使用spark sql但不知道如何进行分页.

尝试:

select * from person limit 10, 10
Run Code Online (Sandbox Code Playgroud)

Kha*_*Rok 7

已经6年了,不知道当时还能不能。

我会在答案上添加一个顺序 ID ,并在offset 和 offset + limit之间搜索寄存器

在纯 Spark SQL 查询中,对于偏移 10 和限制 10,它会是这样的

WITH count_person AS (
    SELECT *, monotonically_increasing_id() AS count FROM person)
SELECT * FROM count_person WHERE count > 10 AND count < 20
Run Code Online (Sandbox Code Playgroud)

在 PySpark 上,它会非常相似

import pyspark.sql.functions as F

offset = 10
limit = 10
df = df.withColumn('_id', F.monotonically_increasing_id())
df = df.where(F.col('_id').between(offset, offset + limit))
Run Code Online (Sandbox Code Playgroud)

即使对于大量数据,它也足够灵活和快速。

  • 请注意“生成的 ID 保证单调递增且唯一,但不连续”。因此,您可能会面临一系列不用作 ID 的整数序列,然后又使用一些更大的整数的风险。 (2认同)

kar*_*ala 2

目前 Spark sql 还不支持 offset。可以用于分页的替代方法之一是通过DataFramesusingexcept方法。

示例:您想要以 10 的分页限制进行迭代,您可以执行以下操作:

    DataFrame df1;
    long count = df.count();
    int limit = 10;
    while(count > 0){
        df1 = df.limit(limit);
        df1.show();            //will print 10, next 10, etc rows
        df = df.except(df1);
        count = count - limit;
    }
Run Code Online (Sandbox Code Playgroud)

如果你想做的话, LIMIT 50, 100首先,你可以执行以下操作:

        df1 = df.limit(50);
        df2 = df.except(df1);
        df2.limit(100);       //required result
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 如果数据框中存在重复的行,这将失败。' except' 将删除 df1 中 df2 中的所有行 (2认同)