2017-02-16 65 views
1

我想使用Apache Spark並通過JDBC連接到Vertica。Apache Spark是否從目標數據庫加載整個數據?

在Vertica數據庫中,我有1億條記錄並在另一臺服務器上運行Spark代碼。

當我在Spark中運行查詢並監視網絡使用情況時,兩臺服務器之間的流量非常高。

看起來Spark加載目標服務器的所有數據。

這是我的代碼:

test_df = spark.read.format("jdbc") 
    .option("url" , url).option("dbtable", "my_table") 
    .option("user", "user").option("password" , "pass").load() 

test_df.createOrReplaceTempView('tb') 

data = spark.sql("select * from tb") 

data.show() 
當我運行這個

,後2分鐘,非常高的網絡使用情況,結果返回。

Spark是否會從目標數據庫加載整個數據?

+0

你可以使用sql(「select count(*)from spark_table」)。explain(true)'來查看查詢計劃,這可能會給你更多的見解。 – Vishnu667

回答

0

JDBC基於DBs允許按下查詢,以便您只從磁盤讀取相關項目:例如:df.filter("user_id == 2").count將首先選擇僅​​過濾的記錄,然後將計數發送到火花。因此,使用JDBC:1.計劃過濾器,2分區根據您的查詢模式,並進一步優化形式火花側前你DB:

val prop = new java.util.Properties 
prop.setProperty("driver","org.postgresql.Driver") 
prop.setProperty("partitionColumn", "user_id") 
prop.setProperty("lowerBound", "1") 
prop.setProperty("upperBound", "272") 
prop.setProperty("numPartitions", "30") 

然而,大多數relational DB通過特定字段以樹艾克結構劃分這對於複雜的大數據查詢並不理想:我強烈建議將表JDBC複製到no-sql,如cassandra,mongo,elastic serach或文件系統(例如alluxiohdfs),以啓用可伸縮 - 並行 - 複雜 - 快速查詢。最後,你可以用aws redshift代替JDBC,這對後端/前端來說不應該很難實現,但是從你的火花端來看,處理重新依賴衝突是一件很痛苦的事情 - 但它可以使你更快地進行復雜的查詢,它會對列進行分區,因此您可以使用多個工作人員自己將列上的聚合推下來 。

+0

這個命令在火花:) 結果= df.filter(df.test_col == 1).Count之間(, 火花數據庫運行此查詢: SELECT 1 FROM事件WHERE( 「test_col」 IS NOT NULL )AND(「test_col」= 1)。 「選擇1」會導致非常高的網絡流量以獲得較大的結果。我怎樣才能以不同的方式來計數? –

0

您的火花的作業之後使用,所用的火花作業並運行相同的憑據完成登錄到Vertica的數據庫:

SELECT * FROM v_monitor.query_requests ORDER BY start_timetamp DESC LIMIT 10000; 

這將顯示你的火花作業發送到數據庫的查詢,讓您查看是否將計數(*)推送到數據庫,或者是否確實嘗試通過網絡檢索整個表。

相關問題