问题出在您的代码中。因为您覆盖了要从中读取的表,所以实际上可以消除所有数据,然后Spark才能实际访问它。
请记住,Spark是懒惰的。创建
DatasetSpark时会获取所需的元数据,但不会加载数据。因此,没有魔术缓存可以保留原始内容。实际需要时将加载数据。在这里,是您执行
write操作且开始写入时,不再有要提取的数据。
您需要的是这样的:
- 创建一个
Dataset
。 应用所需的转换并将数据写入中间MySQL表。
TRUNCATE
原始输入以及INSERT INTO ... SELECT
来自中间表或DROP
原始表与RENAME
中间表的输入。
替代的但不太有利的方法是:
- 创建一个
Dataset
。 - 应用所需的转换并将数据写入持久性Spark表(
df.write.saveAsTable(...)
或等效表) TRUNCATE
原始输入。- 读回数据并保存(
spark.table(...).write.jdbc(...)
) - 放下Spark表。
我们不能过分强调使用Spark
cache/
persist并不是路要走。即使采用保守的
StorageLevel(
MEMORY_AND_DISK_2/
MEMORY_AND_DISK_SER_2)缓存数据也可能会丢失(节点故障),从而导致无声的正确性错误。



