SAS SQL转换为Hive SQL技术求助:附待转换SAS代码示例
SAS SQL 转 Hive SQL 转换结果
1. 生成master表代码
CREATE TABLE master AS SELECT acct_nbr, clnt_nbr, card_typ FROM myquery.int_card ORDER BY acct_nbr, clnt_nbr;
说明:原SAS中
order by 1,2是按查询结果的第1、2个字段排序,Hive也支持该写法,显式写字段名可读性更高,两种写法均可通用。
2. 生成clnt_base表代码
先修正原SAS代码的两处问题:
- 字段名前后不一致:第一个查询定义的卡类型字段为
card_typ,第二个子查询误写为crd_type - 语法错误:
in ('198',199')缺少单引号,修正为in ('198','199')
修正后的转换代码如下:
CREATE TABLE clnt_base AS SELECT clnt_nbr, CASE WHEN clnt_nbr IN (SELECT clnt_nbr FROM master WHERE card_typ IN ('198','199')) THEN 1 ELSE 0 END AS ultima ORDER BY clnt_nbr;
性能优化建议
如果处理的数据量较大,可以改用左关联写法替代IN子查询,执行效率更高,等效代码如下:
CREATE TABLE clnt_base AS SELECT a.clnt_nbr, CASE WHEN b.clnt_nbr IS NOT NULL THEN 1 ELSE 0 END AS ultima FROM (SELECT DISTINCT clnt_nbr FROM master) a LEFT JOIN (SELECT DISTINCT clnt_nbr FROM master WHERE card_typ IN ('198','199')) b ON a.clnt_nbr = b.clnt_nbr ORDER BY a.clnt_nbr;
补充说明:Hive中
ORDER BY会触发全局排序,所有数据进入同一个Reducer执行,性能开销高。如果不需要全局严格排序,可替换为SORT BY实现单Reducer内部排序,大幅提升运行效率。
内容的提问来源于stack exchange,提问作者anurag anand
相关产品推荐
相关产品推荐

