2017-06-06 58 views
0

當我拿到表PySparkSpark Dataframe是否支持針對數據庫的轉換?

df1 = session.read.jdbc(url=self.url, 
         table=self.table, 
         properties={"driver": self.driver, 
            "user": self.user, 
            "password": self.password}) 

df1 = sql.read.format("com.databricks.spark.redshift") 
       .options(url=self.url, 
         query=self.table, 
         user=self.user, 
         password=self.password, 
         tempdir="s3://path/data/").load() 

,然後我採用一些變換喜歡的聯接和GROUPBY

df3 = df1.join(df2, df1.id == df2.id) 
df_res = df3.groupBy("id").agg({'tax': 'sum'}) 

的是,對數據庫做了什麼? 如果是,那麼在記憶中做什麼?

回答

2

不是。雖然Spark可以推下簡單的投影和選擇(細節取決於特定的數據源實現),但它不會對數據庫應用大量處理,除非明確指示在受支持的數據源中進行處理。

例如與jdbc你傳遞一個subquerytable說法,並與com.databricks.spark.redshift可以使用query選項。

隨着第一個片段(jdbc)火花將讀取所有所需數據使用a single executor,在第二片段的初始query(加突起和選擇)的結果(將可能突起和選擇之後)至S3和讀取它從那裏並行。在這兩種情況下,Spark都應該能夠推倒投影(id, tax)

之後Spark將在集羣內本地處理數據,這包括join和聚合。