有些情况下,需要spark读取A路径文件,处理后再存入A路径,如不注意,会报错!!!
1.读写相同的HIVE表
spark读取hive表:
// 原始数据
final_data = spark.sql(s"select * from ${userid}.${datasetid}")
.....对数据操作.....
不能 select 后在overwrite同一张表:
错误的: Spark报错
final_data.write.mode("overwrite").saveAsTable(s"${userid}.${datasetid}")
正确方法:
用临时表先进行保存,再删除临时表:
//将结果保存在临时表中
final_data.write.mode(SaveMode.Overwrite).saveAsTable(s"${userid}.tmp_tab")
//将临时表覆盖结果表
spark.table(s"${userid}.tmp_tab").write.mode("overwrite").saveAsTable(s"${userid}.${datasetid}")
// 删除临时表
spark.sql(s"DROP TABLE IF EXISTS ${userid}.tmp_tab")
2.读写HDFS上相同路径
var final_data = spark.read.parquet(hdfspath)
......对数据操作.....
不能直接写入相同路径
错误:
final_data.write.mode(SaveMode.Overwrite).parquet(hdfspath)
Spark报错:
Caused by: java.io.FileNotFoundException: File does not exist…
正确方法:
先对数据进行cache或者persist
final_data = final_data.persist()
// final_data = final_data.cache()
final_data.write.mode(SaveMode.Overwrite).parquet(hdfspath)