Spark SQL仅插入表中两列报错:未引用列无法解析的解决方法咨询
问题修复方案及原因分析
修复方案
方案1:插入时显式为未指定列提供NULL值
修改INSERT语句,为所有列提供值,未赋值的列用NULL填充:
INSERT INTO my_db.fire_service_calls_tbl VALUES (1234, "aaa", NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
方案2:创建表时为列显式指定默认值
重新创建表,为所有可能不被赋值的列添加DEFAULT NULL(或其他合适的默认值):
create table if not exists my_db.fire_service_calls_tbl( CallNumber integer, UnitID string, IncidentNumber integer DEFAULT NULL, CallType string DEFAULT NULL, CallDate string DEFAULT NULL, WatchDate string DEFAULT NULL, AvailableDtTm string DEFAULT NULL, Address string DEFAULT NULL, City string DEFAULT NULL, CallFinalDisposition string DEFAULT NULL, ZipCode integer DEFAULT NULL, Neighborhood string DEFAULT NULL, Location_Name string DEFAULT NULL, RowID string DEFAULT NULL ) using parquet
之后再执行你原来的INSERT语句即可生效。
原因分析
Spark SQL 3.1.2对Parquet表的部分列插入支持存在局限性:
- Parquet是列式存储格式,Spark需要明确知道未被指定的列如何填充值。即便表列默认是可空的(未显式指定
NOT NULL),该版本的Spark解析器仍会要求未指定的列必须有明确的填充规则(要么显式传NULL,要么有默认值),否则会误判为列未解析。 - 该版本的INSERT INTO语法实现不够完善,对于未指定且无默认值的可空列,无法自动填充NULL,反而抛出列未找到的错误,这属于早期版本的兼容性问题。在后续Spark版本(如3.3+)中,该问题已被修复,可直接支持部分列插入并自动为未指定的可空列填充NULL。
内容的提问来源于stack exchange,提问作者LCJ
相关产品推荐
相关产品推荐

