通过对现有行SPARK - SQL执行GROUP BY来更新表?

时间:2017-09-10 05:10:21

标签: mysql apache-spark apache-spark-sql

我使用MySQL作为我的存储引擎从Spark SQL保存表。我的表看起来像

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

我想通过使用GROUP BY添加计数并删除单个行来更新表。所以我的输出应该像

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

这是一个正确的期望,如果可能的话,如何使用Spark SQL实现它?

2 个答案:

答案 0 :(得分:2)

Soln 1

在MySQL中,您可以使用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]

假设该表具有名为uid的唯一列,

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

请参阅this SO问题,了解有关删除重复行的详情。

答案 1 :(得分:2)

在将表格写入MYSQL之前,请在 spark dataframe / dataset

中应用以下逻辑
import org.apache.spark.sql.functions._
df.groupBy("date").agg(sum("count").as("count"))

将已转换的dataframe写入MYSQL