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
:
其中有三种策略:
-
ANSI 策略(),不允许 Spark 进行某些不合理的类型转换,如:string
转换成 timestamp
。
-
LEGACY 策略,允许 Spark 进行类型强制转换,只要它是有效的 Cast 操作。
-
STRICT 策略,不允许 Spark 进行任何可能有损精度的转换。
解决方法:
-
修改 Spark 版本到 3.0.0
以下。(/dog)
-
修改策略为 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 thread “main“ org.apache.spark.SparkException: Job aborted.
在spark中遇到Exception in thread “main” org.apache.spark.sql.,这往往是所选取 'pibid'字段不存在,或者名字写错了。所以要查该字段!!!
Exception in thread “main” org.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...