Spark SQL执行ALTER TABLE ADD COLUMNS新增列报ParseException排查
Spark SQL ADD COLUMNS 解析异常定位
异常触发场景
执行ALTER TABLE语句为Delta表新增列时抛出ParseException解析错误,执行代码如下:
spark.sql("ALTER TABLE deltaTable ADD COLUMNS (abc LongType, dea LongType AFTER ttt)")
对应报错栈核心信息:
ParseException /databricks/spark/python/pyspark/sql/session.py in sql(self, sqlQuery) --> 777 return DataFrame(self._jsparkSession.sql(sqlQuery), self._wrapped) /databricks/spark/python/lib/py4j-0.10.9.1-src.zip/py4j/java_gateway.py in __call__(self, *args) -> 1304 return_value = get_return_value( 1305 answer, self.gateway_client, self.target_id, self.name)
错误原因
代码存在两处不符合Spark SQL(Delta表扩展)语法规则的问题:
- 类型声明错误:
LongType是Spark DataFrame API层面的类型类名,不属于SQL语法支持的类型关键字,Spark SQL中对应64位长整型的类型为BIGINT - 位置子句使用错误:
AFTER 列名是Delta表对ADD COLUMNS语法的扩展,用于指定新增列的位置,该修饰符不能写在多列定义的括号内部。当使用括号包裹多列批量新增时,括号内仅支持列名、类型、注释、默认值的定义,不支持单列位置修饰;如果需要给单列指定位置,不能放在批量定义的括号里。
修正写法
无位置要求场景
两列都默认新增到表的末尾,直接修正类型名即可:
spark.sql("ALTER TABLE deltaTable ADD COLUMNS (abc BIGINT, dea BIGINT)")
指定列位置场景
需要将dea列放到ttt列之后时,拆分语句单独执行带位置修饰的列新增:
# 新增abc列到表末尾 spark.sql("ALTER TABLE deltaTable ADD COLUMNS abc BIGINT") # 新增dea列到ttt列之后 spark.sql("ALTER TABLE deltaTable ADD COLUMNS dea BIGINT AFTER ttt")
内容的提问来源于stack exchange,提问作者Youshikyou
相关产品推荐
相关产品推荐

