如何使用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()
答案 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