Spark SQL执行Hive兼容查询报错:mismatched input 'from'
问题排查与解决
这是Spark SQL和Hive的语法兼容性问题,两个核心点导致报错:
- 窗口函数写法不符合Spark规范:Spark SQL对函数语法解析更严格,
Row_number ()中函数名与括号之间的空格会被判定为非法,规范写法是小写的row_number()(无空格)。 - 子查询内CTE的支持差异:旧版本Spark SQL不支持在子查询内部定义CTE(
with语句),必须将CTE移到整个查询的最外层。
另外,原SQL里的日期处理可以简化:date_format返回的已经是字符串类型,无需先转整数再转回字符串,直接使用结果即可。
修改后的SQL代码如下:
with abc as( select appl_pcn, appl_corp_strct_in, row_number() OVER(PARTITION BY appl_pcn ORDER BY gcap_extr_dt_tm DESC) AS Recrd_rank1 from cstonedb3.gcap_applcnt_data where appl_no = 0 and pcn_mo between date_format(add_months('2023-09-26', -2),'yyyyMM') and date_format('2023-09-26','yyyyMM') ) select a.appl_sta, a.appl_pcnvendorcode, a.appl_pcn, b.appl_corp_strct_in, a.base_dcsn_dt, a.pcn_curr_cd, a.pcn_mo, case when trim(upper(b.appl_corp_strct_in)) = 'S' then 1 else 0 end as sol_ind from lod1_aml_p2_413_gp_base a left join ( select * from abc where Recrd_rank1 = 1 ) b on a.appl_pcn = b.appl_pcn
补充说明
Hive的SQL解析器对语法容错性更强,允许函数名带空格、子查询内定义CTE,但Spark SQL遵循更严格的ANSI SQL标准,因此会出现Hive能正常运行但Spark报错的情况。
内容的提问来源于stack exchange,提问作者Naman Agarwal
相关产品推荐
相关产品推荐

