欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Sqoop介绍及使用

程序员文章站 2022-04-19 11:14:33
...

Sqoop介绍

Sqoop简介

sqoop 是 apache 旗下一款“Hadoop 和关系数据库服务器之间传送数据”的工具。

核心的功能有两个:导入、导出

导入数据:MySQL,Oracle 导入数据到 Hadoop 的 HDFS、HIVE、HBASE 等数据存储系统

导出数据:从 Hadoop 的文件系统中导出数据到关系数据库 mysql 等

sqoop本质是迁移数据, 迁移的方式:就是把sqoop的迁移命令转换成MR程序

hive本质就是执行计算,依赖于HDFS存储数据,把SQL转换成MR程序

Sqoop介绍及使用

Sqoop基本操作

从RDBMS导入到HDFS中
  • 全表导入到hdfs
sudo -u hive sqoop  import \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--table epp_brd_info \
-m 1 \
--fields-terminated-by '\t'  \
--delete-target-dir \
--target-dir /user/hive/epp_brd_info

--fields-terminated-by 指定分隔符
--delete-target-dir 若目标路径存在则先删除
--target-dir 指定目标路径
-m 表示并发启动map的数量 -m 1表示启动一个map, 指定-m > 1时,必须添加 --split-by 指定分割列,
,分割列要求至少满足两个条件中任一个:1)目标表有主键   2)有num 类型或者date类型,因为会执行 min(split_column),max(split_column)操作来决定如何分割,否则无法启用多个map

hadoop fs -cat /user/hive/epp_brd/part-m-00000 查看导入文件
  • 查询导入到hdfs --query
sudo -u hive sqoop  import \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--query "select affiliation_name,brand_cname from epp_brd_info where affiliation_no='U010102' and \$CONDITIONS" \
-m 1 \
--target-dir /user/hive/epp_brd_info

# Note: --query 带了where条件时需要加上 $CONDITIONS,使用双引号时 $CONDITIONS要转义成 \$CONDITIONS
  • 导入指定字段 --columns
sudo -u hive sqoop  import \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--table epp_org_region \
-m 1 \
--columns region_no,region_name \
--fields-terminated-by "\t" \
--delete-target-dir \
--target-dir /user/hive/epp_org_region     
MySQL数据导入到Hive

Sqoop 导入关系型数据到 hive 的过程是先导入到 hdfs,然后再 load 进入 hive

# 列出MySQL数据的数据库(测试连接)
/usr/bin/sqoop  list-databases --connect jdbc:mysql://10.234.7.xx:3306/sso --username xx --password xx

# 在hive创建mysql的表 [要确保数据库库名是已创建好的]
sudo -u hive sqoop create-hive-table \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--table epp_brd_info \
--hive-table zxl_test.epp_brd_info_empty;

# 单表全导入到hive [要确保数据库库名是已创建好的]
sudo -u hive sqoop  import \
--connect jdbc:mysql://10.234.7.xx:3306/sso \
--username xx \
--password xx \
--table epp_brd_info \
-m 1 \
--hive-import \
--fields-terminated-by "\t" \
--lines-terminated-by "\n"  \
--delete-target-dir \
--hive-overwrite  \
--hive-table zxl_test.epp_brd_info_empty;

导入mysql数据到hive–可用

sudo -u hive sqoop  import -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:mysql://10.234.7.xx:3306/wm?tinyInt1isBit=false \
--username xx \
--password xx \
--table admin_user_app \
--query "select id,user_id,app_id,o_id,c_id,status,date_format(update_time, '%Y-%m-%d %H:%i:%s') update_time,date_format(create_time, '%Y-%m-%d %H:%i:%s') create_time from admin_user_app where 1=1 and \$CONDITIONS" \
--hive-import \
-m 1 \
--null-string '\\N' \
--null-non-string '\\N' \
--fields-terminated-by "\t" \
--lines-terminated-by "\n"  \
--delete-target-dir \
--target-dir /user/hive/admin_user_app \
--hive-overwrite  \
--hive-table zxl_test.admin_user_app;

Note:

  1. time,date,datetime ,timestamp(都是非string类型)导入到hive时时间格式会有问题,如:“2018-07-17 10:01:54.0”;需要在导入时进行处理 —query。

  2. tinyInt1isBit=false 是为了解决sqoop从mysql导入数据到hive时tinyint(1)格式自动变成Boolean;

并行导入mysql数据到hive–可用

nohup sqoop import -D mapred.job.queue.name=root.belle -Dorg.apache.sqoop.splitter.allow_text_splitter=true \
--connect jdbc:oracle:thin:@10.240.xx.xx:1521:xx \
-e "SELECT ID,ORDER_NO,REF_BILL_NO,SHOP_NO,SHOP_NO_FROM,PRODUCT_NO,SIZE_TYPE_NO,SIZE_NO,BRAND_DETAIL_NO,ITEM_FLAG,SCORE_AMOUNT,COLOR_NO,TAG_PRICE,SALE_PRICE,DISC_PRICE,SETTLE_PRICE,REDUCE_PRICE,REBATE_AMOUNT,QTY,AMOUNT,PREF_PRICE,PRO_NO,SPECIAL_SELL_FLAG,DISCOUNT,DISCOUNT_CODE,DISCOUNT_TYPE,DISCOUNT_SOURCE_ID,BILLING_CODE,BALANCE_BASE,VIP_DISCOUNT,BASE_SCORE,PRO_SCORE,COST_SCORE,ITEM_DISCOUNT,REDUCE_PRICE_REASON,BILL_TRANSFER_NO,PRICE_CHANGE_BILL_NO,RETURN_EXCHANGE_NUM,to_char(CREATE_TIME,'YYYY-MM-DD HH24:MI:SS') as CREATE_TIME,to_char(UPDATE_TIME,'YYYY-MM-DD HH24:MI:SS') as UPDATE_TIME,OUT_DATE_OLD,THIRD_TICKET_AMOUNT,CONTRACT_DISCOUNT FROM U_PD_DW.T04_SAL_ORDER_POS_DTL WHERE 1=1 and \$CONDITIONS" \
--hive-import \
--username xx \
--password xx \
--hive-database=retail_pos_bak \
--hive-table t04_sal_order_pos_dtl_bak \
--hive-partition-key data_base_partition \
--hive-partition-value 2016 \
--null-string '\\N' \
--null-non-string '\\N' \
--target-dir  /user/zhang.xl/import/retail_pos_bak_tmp.t04_sal_order_pos_dtl_bak_2016 \
--delete-target-dir \
--hive-drop-import-delims \
--hive-overwrite \
--split-by OUT_DATE \
--m 10 &

Note:

-m 表示并发启动map的数量 -m 1表示启动一个map, 指定-m > 1时,必须添加 --split-by 指定分割列,
,分割列要求至少满足两个条件中任一个:1)目标表有主键 2)有num 类型或者date类型,因为会执行 min(split_column),max(split_column)操作来决定如何分割,否则无法启用多个map。

MySQL数据导入到HBase

sudo -u hive sqoop import \
--connect jdbc:mysql://10.234.7.xx:3306/wm \
--username xx \
--password xx \
--table admin_user_app \
--columns "id,user_id,app_id" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key id \
--hbase-table admin_user_app \
-m 1  \
--split-by id

Shylin