2017-02-28 150 views
2

Env:spark 1.6使用Hadoop。 Hortonworks數據平臺2.5Spark SQL「Limit」

我有一個表有100億條記錄,我想獲得3億條記錄並將它們移動到一個臨時表。

sqlContext.sql("select ....from my_table limit 300000000").repartition(50) 
.write.saveAsTable("temporary_table") 

我看到限制關鍵字實際上使火花只使用一個執行者!這意味着將3億條記錄移動到一個節點並將其寫回Hadoop。 我怎樣才能避免這種減少,但仍然有多個執行者只有3億條記錄。我希望所有節點寫入hadoop。

抽樣可以幫助我嗎?如果是這樣如何?

+0

它無論哪個記錄?如果不是,那麼你可以使用示例函數 –

回答

4

採樣可用於以下方面: -

select ....from my_table TABLESAMPLE(.3 PERCENT) 

select ....from my_table TABLESAMPLE(30M ROWS) 
+0

「Hive還支持按行計數限制輸入......用戶給出的行計數應用於每個分割,因此總行數可以根據輸入分割的數量而變化......例如,以下查詢將從每個輸入分割中取前10行...'SELECT * FROM source TABLESAMPLE(10 ROWS);'「https://cwiki.apache.org/confluence/display/Hive/LanguageManual+採樣 –

+0

'TABLESAMPLE(... PERCENT)'是一個很好的解決方案,'TABLESAMPLE(... ROWS)'不是。後者將使用OP試圖避免的相同'CollectLimit'操作。 – zero323

+0

我會嘗試。 –