HIVE學習與實踐(四):linux shell 腳本 for in 的用法,join 用法,正則表達式函數regexp_extract

linux shell 中 for in

#!/bin/sh 
for date in 20161025 20161027 20161028 20161102 20161103 20161104 20161105
do
echo "${date}"
done

Hive 的 join 用法

假設有tableA和tableB 兩張表,Table A是左邊的表,Table B是右邊的表。
其各有四條記錄,其中有兩條記錄是相同的,如下所示:

id name       id  name
-- ----       --  ----
1  Pirate     1   Rutabaga
2  Monkey     2   Pirate
3  Ninja      3   Darth Vader
4  Spaghetti  4   Ninja

1. join or inner join

    SELECT * FROM TableA INNER JOIN TableB
ON TableA.name = TableB.name
id  name       id   name
--  ----       --   ----
1   Pirate     2    Pirate
3   Ninja      4    Ninja

產生的結果集中,是A和B的交集。
這裏寫圖片描述 |

2. full outer join

SELECT * FROM TableA FULL OUTER JOIN TableB
ON TableA.name = TableB.name
id    name       id    name
--    ----       --    ----
1     Pirate     2     Pirate
2     Monkey     null  null
3     Ninja      4     Ninja
4     Spaghetti  null  null
null    null    1     Rutabaga
null    null    3     Darth Vader

Full outer join 產生A和B的並集。但是需要注意的是,對於沒有匹配的記錄,則會以null做爲值。
這裏寫圖片描述`

SELECT * FROM TableA FULL OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableA.id IS null OR TableB.id IS null
id    name       id    name
--    ----       --    ----
2     Monkey    null    null
4     Spaghetti null    null
null    null    1     Rutabaga
null    null    3     Darth Vader

產生A表和B表都沒有出現的數據集.
這裏寫圖片描述

3. left join

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name
id  name       id    name
--  ----       --    ----
1   Pirate     2     Pirate
2   Monkey      null    null
3   Ninja      4     Ninja
4   Spaghetti   null    null

Left outer join 產生表A的完全集,而B表中匹配的則有值,沒有匹配的則以null值取代。
這裏寫圖片描述

SELECT * FROM TableA LEFT OUTER JOIN TableB ON TableA.name = TableB.name WHERE TableB.id IS null
id  name       id     name
--  ----       --     ----
2   Monkey  null    null
4   Spaghetti   null    null

產生在A表中有而在B表中沒有的集合。
這裏寫圖片描述

4. 連續join。。。on。。。

幾個表之間關鍵字的連續join,得到需要查找的交叉信息。

    select t1.deviceid as deviceid ,t3.site_telephone as telephone ,t4.*
    from 
    DB1.table1 t1
    join DB2. table2 t2 on (t1.deviceid = t2.deviceid)  
    join DB3.table3  t3 on (t2.mobile=t3.telephone)
    join DB1.table4 t4 on (t3.user_no=t4.user_id);

正則表達式函數regexp_extract

其中的index,是按照正則字符串()的位置

    1. 語法: regexp_extract(string subject, string pattern, int index)  
    2. 返回值: string  
    3. 說明:將字符串subject按照pattern正則表達式的規則拆分,返回index指定的字符。注意,在有些情況下要使用轉義字符  
    4. 舉例:  
    5. hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 1) from dual;  
    6. the  
    7. hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 2) from dual;  
    8. bar  
    9. hive> select regexp_extract(‘foothebar’, ‘foo(.*?)(bar)’, 0) from dual;  
    10. foothebar  
匹配手機號碼: 

select count(*) from DB1.user_info_table 
where length(regexp_extract(telephone, '(1[0-9]{10})', 1))=11;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章