2016-07-29 173 views
4

我無法弄清楚如何使用Spark SQL將數據插入Hive表的靜態分區。我可以使用這樣的代碼寫入動態分區:使用Spark SQL將數據插入到靜態Hive分區中

df.write.partitionBy("key").insertInto("my_table") 

但是,我想不出如何將數據插入到靜態分區。這意味着,我想定義整個DataFrame應該被寫入的分區,而不需要將列添加到DataFrame。

我看到在 InsertIntoHiveTable類中提到的靜態分區,所以我想它是支持的。有沒有公​​共的API來做我想要的?

+0

是你能夠找到類似於任何API寫入動態分區? – Explorer

+1

不,我無法找到任何東西,最終將RRD註冊爲臨時表並從中運行SQL INSERT。但是很多Hive代碼已經在Spark 2.0中重寫了,所以現在可能是可行的。 –

回答

1

您可以使用

DataFrame tableMeta = sqlContext.sql(String.format("DESCRIBE FORMATTED %s", tableName)); 
String location = tableMeta.filter("result LIKE 'Location:%'").first().getString(0); 

,並使用正則表達式來得到你的表分區。一旦你的表位置,您可以輕鬆地構建分區位置像

String partitionLocation = location + "/" + partitionKey 

(partitionKey是一樣的東西DT = 20160329 /小時= 21)

然後,你可以寫信給這條道路

df.write.parquet(partitionLocation) 

(對我來說,當我建立數據框,我不包括分區列。不是知道是否有當包含分區列的任何錯誤)

+1

我認爲將DataFrame註冊爲一個臨時表,然後運行Hive SQL,將數據從那裏插入到特定分區是比這更好的解決方案(它不那麼脆弱),但我特別想知道Spark中對此的本機支持。 –

+0

同意運行HiveSQL來插入數據。我也在尋找對此的本地支持,但無法在任何地方找到它。 – tpham