我使用MySQL作为我的存储引擎从Spark SQL保存表。我的表看起来像
+-------------+----------+
| count| date|
+-------------+----------+
| 72|2017-09-08|
| 84|2017-09-08|
+-------------+----------+
我想通过使用GROUP BY添加计数并删除单个行来更新表。所以我的输出应该像
+-------------+----------+
| count| date|
+-------------+----------+
| 156|2017-09-08|
+-------------+----------+
这是一个正确的期望,如果可能的话,如何使用Spark SQL实现它?
答案 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
。