使用Spark SQL跳过/接受

时间:2015-05-15 12:56:56

标签: sql scala apache-spark datastax-enterprise apache-spark-sql

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

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

类似的东西:

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

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

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

答案 1 :(得分:1)

我发现sparksql和dataframe都没有偏移限制。可能在分布式数据中是随机分布的,因此限制与偏移量只有按限制的含义。我们可以使用窗口函数来实现它:

<强> 1。考虑我们想要获得产品,其收入排名为2到5

<强> 2。实施

windowSpec = Window.partitionBy().orderBy(df.revenue.asc())

result = df.select(     &#34;产品&#34 ;,     &#34;类别&#34 ;,     &#34;收入&#34 ;,     。ROW_NUMBER()以上(windowSpec).alias(&#34; ROW_NUMBER&#34),     DENSE_RANK()以上(windowSpec).alias(&#34;秩&#34))。     result.show()     result = result.filter((col(&#34; rank&#34;)&gt; = start)&amp;(col(&#34; rank&#34;)&lt; = end))     result.show()

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