Skip/Take 与 Spark SQL

Skip/Take with Spark SQL

如何使用 Spark SQL 实现 skip/take 查询(典型的服务器端网格分页)。我已经在网上搜索过了,只能在这里找到非常基本的示例,例如: https://databricks-training.s3.amazonaws.com/data-exploration-using-spark-sql.html

我没有看到 ROW_NUMBER() 或 OFFSET/FETCH 的任何概念,例如 T-SQL。有谁知道如何做到这一点?

类似于:

scala > csc.sql("select * from users skip 10 limit 10").collect()

尝试这样的事情:

val rdd = csc.sql("select * from <keyspace>.<table>")
val rdd2 = rdd.view.zipWithIndex()
rdd2.filter(x => { x._2 > 5 && x._2 < 10;}).collect()
rdd2.filter(x => { x._2 > 9 && x._2 < 12;}).collect()

我发现sparksql和dataframe都没有offset限制。可能在分布式数据中是随机分布的,所以limit和offset只对order by limit有意义。我们可以使用window函数来实现它:

1.考虑我们想要获得收入排名从 2 到 5

的产品

2。实施

windowSpec = Window.partitionBy().orderBy(df.revenue.asc())
result = df.select(
    "product",
    "category",
    "revenue",
    row_number().over(windowSpec).alias("row_number"),
    dense_rank().over(windowSpec).alias("rank"))
    result.show()
    result = result.filter((col("rank") >= start) & (col("rank") <= end))
    result.show()

请参考https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html