2017-09-10 8 views
2

MySQLをストレージエンジンとして使用してSpark SQLからテーブルを保存しています。私のテーブルには、私はGROUP BYを使用して、カウントを追加し、個々の行をドロップして、テーブルを更新したい既存の行でGROUP BYを実行してテーブルを更新するSPARK - SQL?

+-------------+----------+ 
|  count|  date| 
+-------------+----------+ 
|   72|2017-09-08| 
|   84|2017-09-08| 
+-------------+----------+ 

のように見えます。だから私の出力は次のようになります

+-------------+----------+ 
|  count|  date| 
+-------------+----------+ 
|   156|2017-09-08| 
+-------------+----------+ 

Spark SQLを使って可能な限り、それを実現する方法はありますか? MySQLでは

答えて

2

SOLN 1

、あなたはグループ化した後、結果を格納するTEMPORARY TABLEを利用することができます。

元のテーブルを切り捨てます。 一時テーブルから元のテーブルにデータを挿入します。次のクエリを使用して

CREATE TEMPORARY TABLE temp_table 

AS 

(SELECT SUM(count) as count, [date] from table_name GROUP BY [date]); 

TRUNCATE TABLE table_name; 

INSERT INTO table_name (count,[date]) 

SELECT (count,[date]) from temp_table; 

DROP TEMPORARY TABLE temp_table; 

SOLN 2

更新行。

UPDATE table_name t 
INNER JOIN 
(SELECT sum(count) as [count], [date] FROM table_name GROUP BY [date]) t1 
ON t.[date] = t1.[date] 
SET t.[count] = t1.[count] 

DELETE t1 FROM table_name t1, table_name t2 
WHERE t1.uid > t2.uid AND t1.[date] = t2.[date] 

は重複行の削除に関する詳細を参照する this SO質問を参照してください、テーブルが uidという名前の一意の列を持っていると仮定。

+0

レコードが増加しているので、テーブルを削除して新しいテーブルを作成することはできません。高価な操作になります。 – jdk2588

+0

私は最初に更新してから削除するほうが速いと思います。あなたのテーブルにはユニークな列がありますか? – jophab

+0

これは一意の列を持たない集約ビューです – jdk2588

2

あなたはMYSQLにテーブルを作成する前に、あなたの火花dataframe/dataset

import org.apache.spark.sql.functions._ 
df.groupBy("date").agg(sum("count").as("count")) 

そしてMYSQLに変換dataframeを書くには、次のロジックを適用します。

+0

これは、テーブルに新しい行を追加する必要がある場合には意味がありますが、既存の行でグループ化する必要があります。 – jdk2588

+0

@ jdk2588、あなたが話している両方のケースに適しています。既存の行を読んで、私が説明したロジックを適用して適用し、mysqlのテーブルを削除し、新しいテーブルを作成することができます。 :) upvoteのためにありがとう:) –

+0

テーブルを削除して更新を適用するのは、上書きする必要があるエントリがいくつかあるだけなので、テーブル全体を削除する必要があります更新する) – jdk2588

関連する問題