2017-01-26 25 views
2

我有一个test表在MySQL中与ID和名称如下图所示:星火SQL和MySQL- SaveMode.Overwrite不插入修改的数据

+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | Name1 | 
+----+-------+ 
| 2 | Name2 | 
+----+-------+ 
| 3 | Name3 | 
+----+-------+ 

我使用星火DataFrame读取该数据(使用JDBC)和修改数据这样

Dataset<Row> modified = sparkSession.sql("select id, concat(name,' - new') as name from test"); 
modified.write().mode("overwrite").jdbc(AppProperties.MYSQL_CONNECTION_URL, 
       "test", connectionProperties); 

但我的问题是,如果我给覆盖模式,它丢弃了上表中,并创建新表,但不插入任何数据。

我通过从csv文件(与测试表相同的数据)中读取并覆盖来尝试相同的程序。这对我有效。

我在这里错过了什么吗?

谢谢!

回答

4

问题出在您的代码中。由于您覆盖了您尝试阅读的表格,因此在Spark实际访问它之前可以有效地清除所有数据。

请记住,Spark是懒惰的。当您创建Dataset Spark将获取所需的元数据,但不会加载数据。所以没有保存原创内容的魔术缓存。数据将在实际需要时加载。在这里执行write操作,当您开始写入时,不会有更多数据被提取。

你需要的是这样的:

  • 创建Dataset
  • 应用所需的转换并将数据写入中间表。
  • TRUNCATE原始输入和INSERT INTO ... SELECT来自中间表或DROP原始表和RENAME中间表。