问题:
在一次使用spark引擎执行如下sql时,报错,但是使用mr引擎、presto引擎却无此问题。
select * from 表名 where day='2022-01-01'
报错信息:
SparkSqlDriver:Failed in [select * from 表名 where day='2022-01-01']
com.fasterxml.jackson.core.JsonParseException Unexpected_character("code 92")) was wxpecting double-quote to start field name at Source
分析原因:
在报错中打印的json解析异常的meta信息中,有个字段名为null,说明可能创建的表有问题导致spark查询异常
在查表的信息:
BLPROPERTIES(
'ORC.COMPRESS' = 'SNAPPY',
'spark.sql.source.schema.numPartCols' = '1',
'spark.sql.source.schema.numParts' = '1',
'spark.sql.source.schema.part.0'='{"type"........}'
)
发现参数 ‘spark.sql.sources.schema.part.0’ 中的存储元数据信息与实际创建表的字段信息不符。在执行spark sql时才会使用该参数。
原因:由于当初在创建表时直接复制的建表语句,仅仅修改了字段名称,参数信息等没有修改,从而导致出现此类问题
解决方案:
使用hive的mr引擎执行如下sql。
ALTER TABLE tablename UNSET TBLPROPERTIES IF EXISTS('spark.sql.create.version');
ALTER TABLE tablename UNSET TBLPROPERTIES IF EXISTS('spark.sql.sources.schema.numPartCols');
ALTER TABLE tablename UNSET TBLPROPERTIES IF EXISTS('spark.sql.sources.schema.numParts');
ALTER TABLE tablename UNSET TBLPROPERTIES IF EXISTS('spark.sql.sources.schema.part.0');
ALTER TABLE tablename UNSET TBLPROPERTIES IF EXISTS('spark.sql.sources.schema.partCol.0');