hive sql語句對in和not in的替換

2021-09-24 13:33:12 字數 3252 閱讀 1605

對於hive-sql裡的子查詢不支援not in或in ,目前測試,應該是乙個hive語句裡只能支援乙個not in 或in語句,多了不支援,對not in的替換用 left join id(關聯字段)is null ,in的替換用left join id is not null替換,或者用left semi join(更優化)

not in 的替換示例

--原sql

select id from a

where id not in (select id from b);

--hive-sql替換示例

select id from a

left join b on b.id=a.id

where b.id is null;

in 替換示例

--原sql

select id from a

where id in (select id from b);

--hive-sql替換示例

select id from a

left join b on b.id=a.id

where b.id is not null;

--或select id from a

left semi join b on a.id=b.id

hive雜記

hivesql裡的日期函式不支援』%y-%m-%d』這樣的表達,雖然不會報錯,但是不會起作用

支援』2019-06-16』這樣的表達

順便記下我自己做的乙個比較複雜的案例

原sql

select

count(distinct t.passport_user_id) 新增使用者數,

count( t.passport_user_id) 新增使用者交易筆數,

sum(t.trade_amount) 新增使用者交易金額

from t_trade t

inner join t_user u on u.passport_user_id = t.passport_user_id

where t.id in (

select min(d.id) id

from t_trade d

inner join t_bank b on d.bank_code = b.bank_code

where b.method_type = 1

and date_format(d.create_time,'%y-%m-%d')= '2019-05-23'

and d.trade_type = 3

and d.bank_trade_status = 1

and d.passport_user_id not in (

select d1.passport_user_id

from t_trade d1

inner join t_bank b on d1.bank_code = b.bank_code

where b.method_type = 1

and d1.income_begin_date < d.income_begin_date ---這是難點,需要用到原sql裡的字段判斷,因此我在替換後的sql裡只好整個搬過去,希望以後能找到更好的解決辦法

and d1.trade_type = 3

and d1.bank_trade_status = 1

)group by d.passport_user_id

)

替換後sql

left semi join(看左表的字段在右表裡存不存在,有的話就返回左表的字段,注:只返回左表的字段,右表的字段不會返回,且右表字段不能出現在條件裡)

select

'金超' channle,

count(distinct t.passport_user_id) new_user,

count( t.passport_user_id) new_count,

sum(t.trade_amount) new_amount

from odsdb_bankconsignment_prod.t_trade t

inner join odsdb_bankconsignment_prod.t_user u on u.passport_user_id = t.passport_user_id

left semi join (

select min(d.id) id

from odsdb_bankconsignment_prod.t_trade d

inner join odsdb_bankconsignment_prod.t_bank b on d.bank_code = b.bank_code

left outer join

( select d1.passport_user_id

from odsdb_bankconsignment_prod.t_trade d1

inner join odsdb_bankconsignment_prod.t_bank b on d1.bank_code = b.bank_code

where b.method_type = 1

and date_format(d1.create_time,'yyyy-mm-dd') < '2019-06-18'

and d1.trade_type = 3

and d1.bank_trade_status = 1

)fon d.passport_user_id=f.passport_user_id

where b.method_type = 1

and date_format(d.create_time,'yyyy-mm-dd')= '2019-06-18'

and d.trade_type = 3

and d.bank_trade_status = 1

---and f.income_begin_dateand f.passport_user_id is null

group by d.passport_user_id

)mt on mt.id=t.id

where t.passport_user_id not in

(select passport_id

from bi_tag_factory.tag_white_list_detail where white_list_id=139)

hive sql 中使用 if 語句

hive sql 中使用 if 語句 hive 是數倉管理中重要的一環,尤其是sql的書寫時大家在執行任務時中最重要的,關係到任務的執行快慢和正確性 今天就來看一下hive中的sql 的使用 案例 insert into table ads sale tm category1 stat mn sel...

hive sql語句和mysql用法區別存檔

mysql和hive版本 mysql版本 5.6.17 hive版本 2.1.1 本功能測試基於以下資料表test group 1 簡單功能實現對比 需求如下 寫出乙個sql語句,按照category分組,並把組內的name使用 分隔符連線。1 mysql中 select category,grou...

解析HiveSql語句中的所有表名

今天有個需求,解析我們hivesql語句中的表名,用來分析資料倉儲中所有表的使用頻率。hive中有個語法分析器可以將sql語法轉換成語法樹,並且可以將語法樹轉換為字串。例如乙個hive的sql語句如下 select t1.c1,t1.c2,t2.c1 from lijie.table1 t1 lef...