这个问题发生在 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
文章来源:https://www.toymoban.com/news/detail-542416.html
如下:文章来源地址https://www.toymoban.com/news/detail-542416.html
val spark: SparkSession = SparkSession.
builder()
.master("local[*]")
.appName("task2_1")
.config("spark.sql.storeAssignmentPolicy","LEGACY")
.enableHiveSupport()
.getOrCreate()
到了这里,关于Exception in thread “main“ org.apache.spark.sql.AnalysisException: Cannot write incompatible data to的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!