2016-07-15 33 views
3

它有沒有任何可靠和有效的方式來確保impala查詢結果完全物化而不將結果打印到控制檯? 作爲例子,我將使用INNER JOIN查詢。確保Impala查詢得到實現

實現查詢結果的顯而易見的方法是將創建爲選擇

CREATE TABLE t3 STORED AS PARQUET AS SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id; 

與它的問題是,將其寫入到光盤因此是低效的。我正在尋找最有效的方式來執行查詢並確保結果具體化。

作爲示例,在Spark I中,可以使用.cache方法,然後使用.count以確保查詢已實現。

val t3 = t1.join(t2, "id") 
t3.cache 
t3.count 

我可以嘗試與子查詢的解決方法。

SELECT COUNT(*) FROM (SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id) t3; 

但我仍需要確保子查詢物化,這不是很明顯,如果查詢優化器發現我只是在總數感興趣。也許有一些提示強制執行這個或其他技巧?

+0

您希望查詢具體化,但您不希望將查詢實現(即數據持久化到磁盤)。我在那裏看到一種矛盾。或者,也許你只是想對Impala守護進程進行壓力測試,只是爲了看看他們放棄OOM的哪一點? –

+0

換句話說:Impala是一個SQL執行引擎,不是數據處理框架(*àla * Spark),不是分佈式緩存(*àla * Redis)。查詢執行完畢後,什麼也沒有。除了幾個日誌。 –

+0

@SamsonScharfrichter感謝您的評論,在許多SQL數據庫中,您可以將查詢結果保存到變量中並進行進一步的重新使用。如果黑斑羚有這樣的功能,它會解決我的情況。我想實現查詢,但我不希望產生結果傳輸/打印開銷,所以'select count(*)'外部查詢 - 比*更好地將表創建爲select *。我不認爲這是矛盾的。只是在服務器端執行查詢的精確時間。 – jangorecki

回答

1

AFAIK你不能這樣做與Impala,並將永遠無法。
Cloudera專門設計了該工具來支持BI工具,如Tableau,Qlik,MicroStrategy等 - 但不支持專用的 ETL腳本。

另一方面配置單元現在附帶一個「HPL-SQL」過程語言包裝,可能適合您的需求。注意事項:

  • 要求蜂巢2.0+
  • 需要運行你的整個腳本的HPL-SQL解釋,不是基礎蜂巢客戶端(也沒有一個標準的JDBC連接)

HPL-SQL工具聲稱它也支持Impala查詢,但我從未調查過該索賠。可以解決您的問題,作爲一種笨拙的解決方法。

參考文獻:
    HIVE-11055(PL/HQL工具促成了蜂巢代碼庫)的解決方法
    HPL/SQL website


說起,爲什麼不使用星火,如你所說你自己?您可以使用Spark原生Parquet庫或使用與Impala守護程序的自定義JDBC連接來讀取Impala/Hive表。本質上它與HPL/SQL解決方案類似。

+0

謝謝,很好的回答,我將等待賞金一段時間,我已經在使用Spark在基準測試中,想要更精確地反映Impala,看起來最好的方法是測試兩個不同的查詢:select count(*)和create table select,這樣讀者可以使用他/她的用例所需的度量。 – jangorecki