Sqoop介绍及使用

Sqoop介绍

Sqoop简介

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

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

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

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

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

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

Sqoop介绍及使用_第1张图片

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

你可能感兴趣的:(大数据,Hive,Sqoop)