2016-04-26 25 views
1

我們的羣集具有Spark 1.3和Hive 有一個大的Hive表格,我需要隨機添加選定的行。 有一個小表,我閱讀並檢查一個條件,如果條件爲真,那麼我抓住我需要的變量,然後查詢隨機行來填充。我所做的就是在該條件下進行查詢,table.where(value<number),然後使用take(num rows)將其設置爲數組。然後,由於所有這些行都包含我需要的信息,因此需要從大型配置表格中選擇哪些隨機行,我遍歷數組。遞增添加到具有Scala + Spark 1.3的Hive表格

當我執行查詢時,我在查詢中使用ORDER BY RAND()(使用sqlContext)。我創建了一個var Hive table(可變),從大表中添加一列。在循環中,我做unionAll newHiveTable = newHiveTable.unionAll(random_rows)

我已經嘗試了很多不同的方法來做到這一點,但我不知道什麼是避免CPU和臨時磁盤使用的最佳方法。我知道Dataframes不適用於增量式添加。 我現在要嘗試的一件事是創建一個cvs文件,在循環中遞增地將隨機行寫入該文件,然後當循環結束時,將cvs文件作爲表加載,然後執行一個unionAll以獲得我的決賽桌。

任何反饋將是偉大的。由於

+0

你必須移動到最近的星火版本的選擇呢?那麼你可以這樣做:'yourDataFrame.writer().mode(SaveMode.Append).saveAsTable(「YourTableName」' – user1314742

+0

它不會到下個月才升級到Spark 1.5 – KBA

回答

2

我建議你創建一個蜂巢的外部表,定義的位置,然後讓火花寫輸出爲CSV到該目錄:

在蜂巢

create external table test(key string, value string) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ';' 
LOCATION '/SOME/HDFS/LOCATION' 

然後從與https://github.com/databricks/spark-csv助手火花,寫數據幀到CSV文件,並追加到現有的:

df.write.format("com.databricks.spark.csv").save("/SOME/HDFS/LOCATION/", SaveMode.Append) 
+1

非常感謝,這有助於我複製架構我希望在Hive中使用'LIKE tablename'添加到表中對於任何人來說,由於防火牆的原因,我必須下載databricks和apache jar文件,並將它們添加到命令行,當我做了spark-submit 。'spark-submit --master yarn-client --class main main.jar --jars spark-csv_2.10-1.4.0.jar,commons-csv-1.2.jar'現在正在爲每個文件寫入文件在Scala中,將它們添加到內存中的配置單元表中,並將unionAll與我想要添加並保存的原始對象相關聯 – KBA

+0

Note2對於任何人,我還必須添加一行到我的sbt文件中:'libraryDependencies ++ = Seq(''「com.databricks」%%「spark-csv」%「1.4.0」' – KBA

+1

對不起,我不明白你的問題「你會如何加載它們」,你是什麼意思?實際上,因爲它們與外部表位於同一位置,所以它們會自動加載,您不必執行任何操作來加載它們。這就是爲什麼我們創建外部表 – user1314742