Spark SQL 1.6 JDBC下推查询MS SQL MAX函数遇列名缺失异常
解决Spark SQL 1.6 JDBC下推MAX聚合查询的列名缺失异常
这个问题我太熟悉了!你碰到的No column name was specified for column 1 of 't'异常,根源很明确:你的子查询里用聚合函数MAX(ID)生成的结果列没有指定别名,而你用的jtds JDBC驱动要求查询返回的每一列都必须有明确的列名,否则就会抛出这个错误。至于SELECT *能正常运行,是因为原表的ID列本身就有定义好的列名,驱动可以直接识别。
要解决这个问题,只需要给聚合函数的结果添加一个别名就行,修改你的代码如下:
def getMaxID(sqlContext: SQLContext,tableName:String) = { // 给MAX(ID)添加别名max_id,确保结果列有明确名称 val pushdown_query = s"(SELECT MAX(ID) AS max_id FROM ${tableName}) as t" val maxID = sqlContext.read.jdbc(url = getJdbcProp(sqlContext.sparkContext).toString, table = pushdown_query, properties = getDBConnectionProperties(sqlContext.sparkContext)) .head().getLong(0) maxID }
为什么这样能解决问题?
当你执行MAX(ID)时,MS SQL返回的结果列默认没有正式名称(或者会用系统生成的临时名称),但JDBC驱动需要明确的列名来映射结果集。通过AS max_id给这个聚合结果指定别名后,驱动就能正确识别这一列的名称,从而顺利解析结果集,不会再抛出列名缺失的异常。
另外提醒一句:不光是MAX聚合,只要是在JDBC下推查询中使用聚合函数、计算列(比如ID+1这类表达式),都记得给结果列加别名,这是JDBC场景下的通用要求,能避免不少类似的驱动报错。
内容的提问来源于stack exchange,提问作者nilesh1212
相关产品推荐
相关产品推荐

