3

如何使用Spark SQL實現跳過/執行查詢(典型的服務器端網格分頁)。我已經在網上搜索,只能找到這樣的非常基本的例子: https://databricks-training.s3.amazonaws.com/data-exploration-using-spark-sql.htmlSkip/Take with Spark SQL

我沒有看到像T-SQL一樣的ROW_NUMBER()或OFFSET/FETCH的概念。有誰知道如何做到這一點?

喜歡的東西:

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

回答

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

確定視圖(rdd.view)應該在那裏?它只適用於我忽略視圖。 – KingOfHypocrites

+0

這很棒,但它的表現如何?它是否必須從數據庫中提取所有記錄,還是僅在第一次調用collect()時才查詢它們?當你調用zipWithIndex()時,我會認爲它從數據庫中提取所有記錄...否則它會對所有記錄進行編號?如果你有2M記錄會發生什麼,等等。謝謝! – KingOfHypocrites

+0

這是什麼意見是爲 – phact

0

我發現,無論sparksql和數據幀不具有與偏移限制。可能在分佈式數據中是隨機分佈的,因此用偏移量限制只有按義有序。我們可以使用窗口函數來實現它:

1.考慮我們想要得到的產品,其收入排名2至5

2.實施

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

結果= df.select( 「product」, 「category」, 「revenue」, row_number().over(windowSpec).alias(「row_number」), dense_rank()。o (col(「rank」)< = end)) (「col」(「rank」)) result.show()

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