您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“傳統hive數據表怎么通過寫SQL方式實現數據的更新”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“傳統hive數據表怎么通過寫SQL方式實現數據的更新”這篇文章吧。
1.這里新建兩張表student10,student10_temp(臨時表,可看成業務庫),建表語句如下:
//學生信息表create table student10(id string,name string,age string) row format delimited fields terminated by',' stored as textfile;//學生信息表臨時表,業務關系數據庫的變化,一般先導入臨時表create table student10_temp(id string,name string,age string) row format delimited fields terminated by',' stored as textfile;
2.數據準備,可理解成業務庫更新前全量數據,文件test.txt,數據如下:
[root@salver158 ~]# cat /tmp/test.txt 1,name1,162,name2,173,name3,18
3.這里先將test.txt中的數據加載到student10_temp表中,執行命令:
hive> load data local inpath '/tmp/test.txt' into table student10_temp;Loading data to table lujs.student10_tempTable lujs.student10_temp stats: [numFiles=1, numRows=0, totalSize=33, rawDataSize=0]OKTime taken: 1.275 seconds
執行insert into將student10_temp,全量插入到student10表中:
hive> insert into table student10 select id,name,age from student10_temp;
到這里兩張表數據相同,這就相當于我們生產上,第一次進行了全量數據的導入;這時候我們更新了student10_temp表(這里模擬業務關系數據庫中刪除一條數據,插入了兩條數據),這里直接加載文件test1.txt:
[root@salver158 tmp]# cat /tmp/test1.txt 2,name2,173,name3,5104,name4,195,name5,20
其實這個student10_temp一般代表的是關系型數據庫的變化,然后可通過sqoop等數據抽取工具,全量抽取關系數據庫已變化的數據到student10_temp臨時表中。
hive> select * from student10_temp;OK2 name2 173 name3 5104 name4 195 name5 20
4.我們可以通過SQL進行數據比對,然后把非增量、非更新的數據覆蓋到student10表中,執行完SQL后可保證student10和student10_temp數據不重復(這里表必須要有主鍵,不然沒法關聯)
找出非增量、非更新數據,一般就是已刪除數據,執行命令:
select b.id,b.name,b.age from student10 a left join student10_temp b on a.id=b.id where b.id is nul
將非增量、非更新數據覆蓋到student10表,執行命令:
insert overwrite table student10 select b.id,b.name,b.age from student10 a left join student10_temp b on a.id=b.id where b.id is null
執行完后,表中只有非增量、非更新數據,一般就是業務庫已刪除數據,這里我們可以選擇保留做個標識;
5.經過步驟4的比對去重之后,則可以把臨時表數據加載進來,執行命令:
hive> insert into table student10 select id,name,age from student10_temp;
查看最終數據,包含非增量、非更新數據,以及更新和增量數據:
hive> select * from student10;OK1 name1 162 name2 173 name3 5104 name4 195 name5 20Time taken: 0.436 seconds, Fetched: 5 row(s)
我這里只是簡單的一種數據更新方案,中間可能問題,數據更新之前最后都要做好備份,以免丟失數據。
補充SQL:
1.比對新增、更新數據SQL,這里可以執行步驟4之前查看,可在student10表中添加一個標識字段來標識,是已刪除、更新、還是新增數據,這里就不在演示,有興趣自己去研究下:
hive> select a.id,a.name,a.age,CASE WHEN b.id IS null THEN '新增' ELSE '更新' END FROM student10_temp a LEFT JOIN student10 b on a.id=b.id;
Query ID = root_20200310194355_d5428597-77a7-40e6-8b56-6b636c3e137e
Total jobs = 1
Launching Job 1 out of 1
Status: Running (Executing on YARN cluster with App id application_1583204243863_0026)
--------------------------------------------------------------------------------
VERTICES STATUS TOTAL COMPLETED RUNNING PENDING FAILED KILLED
--------------------------------------------------------------------------------
Map 1 .......... SUCCEEDED 1 1 0 0 0 0
Map 2 .......... SUCCEEDED 1 1 0 0 0 0
--------------------------------------------------------------------------------
VERTICES: 02/02 [==========================>>] 100% ELAPSED TIME: 6.59 s
--------------------------------------------------------------------------------
OK
2 name2 17 更新
3 name3 510 更新
4 name4 19 新增
5 name5 20 新增
以上是“傳統hive數據表怎么通過寫SQL方式實現數據的更新”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。