Spark异常总结
1、Spark读写同一张表报错问题Cannot overwrite a path that is also being read from
问题描述:Spark SQL在执行ORC和Parquet格式的文件解析时,默认使用Spark内置的解析器(Spark内置解析器效率更高),这些内置解析器不支持递归子目录的两项参数。可以通过设置 spark.sql.hive.convertMetastoreOrc=false 来指定Spark使用Hive的解析器,使递归子目录参数正确生效。Spark的内置解析器也将于未来版本中支持递归子目录。
当用户在使用Spark读写同一张Hive表时,经常会遇到 “Cannot overwrite a path that is also being read from “的报错,而同样的语句在Hive中可以进行。这是由于Spark对数仓常用的数据类型做了自己的实现方式,在他自己的实现方式下,目标路径会先被清空,随后才执行写入,而Hive是先写入到临时目录,任务完成后再将结果数据替换目标路径。使用Hive解析器也可以解决这个问题。
解决方法:spark.sql.hive.convertMetastoreOrc=false;
spark.sql.sources.partitionOverwriteMode=dynamic;
注意:使用hive方式执行,Hive的ORC在读取某些Hive表时,会出现数组越界异常或空指针异常。其原因是某些目录下存在空的ORC文件,可通过设置hive.exec.orc.split.strategy=BI 规避空指针问题,设置hive.vectorized.execution.enabled=false 规避数组越界问题。