亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

sqoop導入數據、全庫導入和創建job以及實現定時增量導入的示例分析

發布時間:2021-12-18 13:38:54 來源:億速云 閱讀:532 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關sqoop導入數據、全庫導入和創建job以及實現定時增量導入的示例分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

先從功能簡單的開始介紹,

  1. sqoop導入單個表到hive:

sqoop import \
--connect jdbc:mysql://192.168.49.214:3306/mysqlcdc 
--username root \
--password 123456 \
--table data \
--hive-import \
--fields-terminated-by '\t' \
-m 1

這是最簡單的將mysql表導入hive中,沒有指定hive表名,默認在default庫,表名和mysql表同名。sqoop也可以通過sql語句來從多表中選擇自己想要的數據,比如:

sqoop import \
--connect 'jdbc:sqlserver://192.168.49.180:1433;database=rcscounty_qn' \
--username sa \
--password 123456! \
--fields-terminated-by '\t' \
--hive-import \
--hive-table rcs.user_orgname \
--m 1 \
--query 'SELECT u.USER_ID as id, u.USER_NAME as name, u.ORG_ID as orgId, o.ORG_NAME as orgName FROM USER u ,  ORG o where o.ORG_ID = u.ORG_ID and $CONDITIONS'

通過sqoop導入sqlserver數據庫的數據,通過query查詢出自己想要的數據,將這些數據導入hive中。 $CONDITIONS 是不能缺少的,有查詢條件的時候查詢條件和and連接,沒有查詢條件的時候放在where中就可以了。

通過sqoop導入數據到hive中,有以下一些特點:

1)指定的hive表可以存在也可以不存在,不存在則會自動創建,表存在假如沒有數據則會將數據導入,數據格式不對會報錯,加入--hive-overwrite會將hive表進行重寫。

2)通過sqoop創建的hive表只能是內部表,即使通過--target-dir指定了數據在hdfs中存儲的路徑,實際上在hdfs中只會創建文件夾,數據默認是放在/user/hive/warehouse/里面。

3)同一張hive表通過--fields-terminated-by指定的分隔符要統一,否則后導入的數據會擠到一列,無法分開。

2.sqoop全庫導入

sqoop import-all-tables "-Dorg.apache.sqoop.splitter.allow_text_splitter=true" \
--connect 'jdbc:sqlserver://192.168.49.180:1433;database=rcscounty_qn' \
--username sa \
--password 123456 \
--fields-terminated-by '\t' \
--hive-database ods_quannan \
-m 10 \
--create-hive-table \
--hive-import \
--hive-overwrite \
--autoreset-to-one-mapper

將一個數據庫內的表都導入一個hive庫中,假如這個庫中所有的表都有主鍵,則不需要最后一行的--autoreset-to-one-mapper。

假如需要將每個hive表進行一定規律的改名,比如以前的表名是table,希望導入的表名叫ods_table,是無法通過sqoop來實現的,需要自己寫腳本來導入。

我在執行全庫導入時,全庫為133張表,實際導入為80張表。可能是我參數哪里有問題,多次執行都是這樣。所以建議導入之后檢查一下數量是否正確。

3.sqoop增量導入

由于hive表沒有主鍵,所以hive表無法實現update,只能將新插入的數據添加進來,也就是增量導入。

增量導入有兩種方式,一種是append,一種是incremental lastmodified。

增量導入只能導入到hdfs中,不能導入到hive中,所以語句中不要有--hive import。

append方式:

sqoop import \
--connect 'jdbc:mysql://192.168.49.201:3307/blade?serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL' \
--username root \
--password 123456 \
--table blade_blog \
--target-dir '/user/hive/warehouse/ods.db/blade_blog' \
--incremental append \
--check-column id \
--last-value 3 \
-m 1

由于修改的是hdfs數據,所以需要用target-dir指定hdfs路徑。沒有加時區可能會報錯Establishing SSL connection without server's identity verification is not recommended.但是加了時區,在傳遞時間類型的數據時,假如設置不正確,可能會將hive中得到的數據比mysql中的數據快/慢。在設置的時候要先查詢自己數據庫的時區設置,一般mysql默認時區是UTC。

&zeroDateTimeBehavior=CONVERT_TO_NULL參數和時區原因一致,不加的話無法連接到mysql數據庫。假如不加就能連到mysql數據庫的話,不加也可以。

指定增量方式為append,檢查列為id,設定值為3,所以id比3大(不含等于)的數據都會被導入。不會合并重復數據,所以如果你連續執行兩遍,會看到兩個id為4的數據。

檢查列不能是字符,必須是數字或者是時間。append方式官方推薦用數字,時間建議用lastmodified方式導入。

lastmodified方式又分兩種增量導入方式,一種是不合并重復數據(append),一種會合并重復數據(merge-key) ,例子如下

append方式

sqoop import --connect 'jdbc:mysql://192.168.49.214:3306/mysqlcdc?serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL' \
--username root \
--password 123456 \
--table data \
--target-dir '/user/hive/warehouse/data' \
--check-column last_mod \
--incremental lastmodified \
--last-value '2019-08-30 16:49:12' \
--m 1 \
--append

last_mod列所有時間大于等于2019-08-30 16:49:12的數據都會被導入。

merge-key方式:

sqoop import --connect 'jdbc:mysql://192.168.49.214:3306/mysqlcdc?serverTimezone=CST&zeroDateTimeBehavior=CONVERT_TO_NULL' \
--username root \
--password 123456 \
--table data \
--target-dir '/user/hive/warehouse/data' \
--check-column last_mod \
--incremental lastmodified  \
--fields-terminated-by ',' \
--last-value '2019-08-28 17:31:58' \
--m 1 \
--merge-key id

指定merge-key為id,hive表中所有id重復的數據都會合并,無論是否是本次增量導入添加的。

要注意一點,導入的數據實際時間范圍是你指定的last-value到執行這個sqoop語句,比如你指定了last-value為2019-08-28 17:31:58,執行這個sqoop語句的時間是2021-1-8 15:00:00,但是數據庫里有個數據時間是2022-2-4 12:31:21,這個數據是不會被導入進來的。在打印的日志里面能夠看到:

sqoop導入數據、全庫導入和創建job以及實現定時增量導入的示例分析

假如執行沒有報錯,重復數據也合并了,但是數據沒有更新也沒有新導入,建議檢查一下hdfs文件路徑是否正確。

4.將增量導入創建為job,并建立定時任務

sqoop可以將一些sqoop操作保存下來作為job,方便以后執行。之后創建定時任務,來達到定時增量導入的目的。

創建sqoop job:

sqoop job  \
--create one.more.time \
-- import \
--connect 'jdbc:mysql://192.168.49.101:3307/maybe?serverTimezone=UTC&zeroDateTimeBehavior=CONVERT_TO_NULL' \
--username root \
--password 123456 \
--table blade_blog \
--target-dir '/user/hive/warehouse/ods.db/b_blog' \
--fields-terminated-by '\t' \
--m 1 \
--check-column update_time \
--incremental lastmodified  \
--last-value '2020-01-16 15:34:01' \
--merge-key id

這樣就創建了名為one.more.time的job了。

查看job:

sqoop job --list

通過job來執行定時增量導入,第一次執行的last-value值為你指定的值,之后運行會記錄你執行這個job的時間,來作為下次last-value的參數,實現動態配置last-value,避免重復導入。

執行job:

sqoop job --exec one.more.time

創建定時任務:

先檢查是否安裝了crontab

rpm -qa | grep crontab

沒有的話安裝crontab,centos為yum install crontabs。

編寫一個shell腳本,來執行job。

為當前用戶創建定時任務:

crontab -e

進入編輯

40 08 * * 1-5 ls /home/software/sqoop-script/maybe.sh

表示周一至周五,每天8:40執行maybe.sh。更多的crontab時間編寫規范請看  Linux基礎之定時任務。

這樣就實現定時增量同步了。

關于sqoop導入數據、全庫導入和創建job以及實現定時增量導入的示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

昌图县| 肇源县| 巴彦县| 饶河县| 东乌| 嘉兴市| 西昌市| 柯坪县| 海阳市| 南宁市| 阳西县| 海宁市| 肃宁县| 正安县| 胶州市| 淳化县| 元阳县| 徐州市| 威宁| 义马市| 隆林| 沧州市| 蒙阴县| 广东省| 乌鲁木齐县| 鄂托克前旗| 康马县| 阳新县| 靖西县| 宜川县| 宁武县| 荔浦县| 吉隆县| 会宁县| 临湘市| 道孚县| 普陀区| 宝丰县| 修武县| 哈尔滨市| 沿河|