相关文章推荐
怕老婆的卤蛋  ·  C# 基本语法 | ·  2 周前    · 
没有腹肌的开水瓶  ·  Exception in thread ...·  5 小时前    · 
千年单身的蚂蚁  ·  Exception in thread ...·  5 小时前    · 
憨厚的感冒药  ·  升级 ...·  3 月前    · 
卖萌的紫菜汤  ·  TypeScript ...·  4 月前    · 

Exception in thread “main“ org.apache.spark.sql.AnalysisException: Cannot write incompatible data to

最新推荐文章于 2024-10-23 11:22:23 发布
最新推荐文章于 2024-10-23 11:22:23 发布 阅读量5.8k

这个问题发生在 Spark SQL 将数据迁移进 Hive 时会出现。

Exception in thread "main" org.apache.spark.sql.AnalysisException: Cannot write incompatible data to table '`xx`.`table_name`':
- Cannot safely cast 'input_time': string to timestamp
- Cannot safely cast 'insert_time': string to timestamp
- Cannot safely cast 'modify_time': string to timestamp;

这是因为从 Spark 3.0.0 开始,Spark SQL 增加了一个安全策略,不对非同类型的数据进行强制转换,然后就会出现这个错误。

我们在源码文件 SQLConf.scala 中发现有这样一个配置 StoreAssignmentPolicy

在这里插入图片描述
在这里插入图片描述
其中有三种策略:

  1. ANSI 策略(),不允许 Spark 进行某些不合理的类型转换,如:string 转换成 timestamp

  2. LEGACY 策略,允许 Spark 进行类型强制转换,只要它是有效的 Cast 操作。

  3. STRICT 策略,不允许 Spark 进行任何可能有损精度的转换。

解决方法:

  1. 修改 Spark 版本到 3.0.0 以下。(/dog)

  2. 修改策略为 LEGACY

指定参数:spark.sql.storeAssignmentPolicy=LEGACY

        val spark: SparkSession = SparkSession.
                builder()
                .master("local[*]")
                .appName("task2_1")
                .config("spark.sql.storeAssignmentPolicy","LEGACY")
                .enableHiveSupport()
                .getOrCreate()
				
编写Spark程序在调用自定义函数时出现如下问题 `Exception in thread "main" org.apache.spark.sql.AnalysisException: Table or view not found: df; line 1 pos 30; 'Project [unresolvedalias('myFunction('Fruit), None)] +- 'UnresolvedRelation [df]`
本地运行spark报错为Exception in threadmainorg.apache.spark.SparkException: Job aborted.
spark中遇到Exception in threadmainorg.apache.spark.sql.,这往往是所选取 'pibid'字段不存在,或者名字写错了。所以要查该字段!!! Exception in threadmainorg.apache.spark.sql.AnalysisException: cannot resolve ‘pibid’ given input columns: [spark_catalog.lg_edu_warehouse.dwd_t_baseexamh
这个是报错信息 Exception in thread "main" org.apache.spark.sql.AnalysisException: Cannot up cast `age` from bigint to int. The type path of the target object is: - field (class: "scala.Int", name: "age") Exception in thread "main" org.apache.spark.sql.AnalysisE
先看下官方文档导致这个问题的原因: readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。 也就是说,默认情况下,出于安全考虑,Mybatis将缓存设置成可读写的,然后通过序列化的方式返回给我们缓存的对象拷贝。 如果我们的对象没有实现可序列化的接口就会抛出 org.apache.ibat
Exception in thread "main" org.apache.spark.sql.AnalysisException: Table or view not found: emp; line 1 pos 47 at org.apache.spark.sql.catalyst.analys...
开发中经常会遇到java.lang.String cannot be cast to java.lang.Integer异常,记录下我怎么解决的。 这种异常就是经常会出现类型转换的地方,这里面有些小坑,必须要踩过,撸源码才知道问题原因,哈哈。 比如我在Double转String,Integer转String的过程中遇到的坑: Double.parseDouble()和Double.valueOf()方法的区别: parseDouble()方法得到的数据类型不能继续编译,因为这个方法得到的是 double ,
sparksql语句时出现的错误,他说该字段不在表中 Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve '`Class`' given input columns: [Cno, Cnam, Tno]; line 1 pos 28; 'Project [*] +- 'Filter...