如何实现spark sql分页查询

时间:2015-03-24 08:29:40

标签: apache-spark apache-spark-sql

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

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

尝试:

select * from person limit 10, 10

4 个答案:

答案 0 :(得分:3)

如果数据框中有重复的行,

karthik's answer将失败。 '除了'将删除df1中df2中的所有行。

val filteredRdd = df.rdd.zipWithIndex().collect { case (r, i) if 10 >= start && i <=20 => r }
val newDf = sqlContext.createDataFrame(filteredRdd, df.schema)

答案 1 :(得分:2)

目前在spark sql中不支持偏移量。您可以使用DataFrames方法通过except进行分页的其中一种方法。

示例:您希望以分页限制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;
    }

如果您想先说LIMIT 50, 100,可以执行以下操作:

        df1 = df.limit(50);
        df2 = df.except(df1);
        df2.limit(100);       //required result

希望这有帮助!

答案 2 :(得分:0)

请在下面找到一个名为 SparkPaging 的有用的 PySpark(Python 3 和 Spark 3)类,它抽象了分页机制: https://gitlab.com/enahwe/public/lib/spark/sparkpaging

用法如下:

SparkPaging

用于分页数据帧和数据集的类

示例

- 初始化示例 1:

通过指定限制来接近。

sp = SparkPaging(initData=df, limit=753)

- 初始化示例 2:

通过指定页数来处理(如果有剩余页数会增加)。

sp = SparkPaging(initData=df, pages=6)

- 初始化示例 3:

通过指定限制来接近。

sp = SparkPaging()
sp.init(initData=df, limit=753)

- 初始化示例 4:

通过指定页数来处理(如果有剩余页数会增加)。

sp = SparkPaging()
sp.init(initData=df, pages=6)

- 重置:

sp.reset()

- 迭代示例:

print("- Total number of rows = " + str(sp.initDataCount))
print("- Limit = " + str(sp.limit))
print("- Number of pages = " + str(sp.pages))
print("- Number of rows in the last page = " + str(sp.numberOfRowsInLastPage))
while (sp.page < sp.pages-1):
    df_page = sp.next()
    nbrRows = df_page.count()
    print("  Page " + str(sp.page) + '/' + str(sp.pages) + ": Number of rows = " + str(nbrRows))

- 输出:

- Total number of rows = 4521
- Limit = 753
- Number of pages = 7
- Number of rows in the last page = 3
    Page 0/7: Number of rows = 753
    Page 1/7: Number of rows = 753
    Page 2/7: Number of rows = 753
    Page 3/7: Number of rows = 753
    Page 4/7: Number of rows = 753
    Page 5/7: Number of rows = 753
    Page 6/7: Number of rows = 3

答案 3 :(得分:0)

已经6年了,不知道当年能不能实现

我会在答案上添加一个连续的 id 并搜索寄存器之间的偏移量和偏移量 + 限制

在纯 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

在 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)

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