sqoop总结

1.数仓模型

1.1建模方法

ER模型:

​ 常用于OLTP数据库建模

维度模型:

​ 面向分析场景而生;对称易扩展

1.2星型/雪花

星型模型:

​ 一个事实表+多个维度表;事实表和维度表通过主键外键相连;

​ 数据冗余;查询逻辑简单,查询性能高

雪花模型:

​ 部分维度表没有直接连到事实表;

​ 去冗余;查询逻辑难,查询性能低;

星座模型:

​ 多个事实表+多个维度表

总结:

数仓多使用星型模型构建底层数据hive表, 通过冗余来建好查询次数从而提高查询效率; 对olap分析引擎友好.

雪花模型在关系型数据库mysql,oracle中较为常见,特别是电商的数据库表.

2.sqoop

导入导出:

​ 关系数据库(mysql,oracle)

​ Hadoop的hdfs,hive,hbase等

list

sqoop list-databases \
--connect jdbc:mysql://ip:3306/ \
--username 用户名 \
--password 密码 \

sqoop list-tables \
--connect jdbc:mysql://ip:3306/库名 \
--username 用户名 \
--password 密码

import

从关系型数据库导入hdfs(包括hive,hbase), 如果导入的是hive,没有表它会自动创建

导入hdfs

##mysql导入hdfs

sqoop import \
--connect jdbc:mysql://ip:3360/库名 \
--username root \
--password root@123 \
--target-dir hdfs://summer/apps/hive/warehouse/a.db/user_label \ ##指定hdfs表目录 
--fields-terminated-by '^' \  ##设定导入数据后每个字段分隔符,默认是分号(;)分隔
--lines-terminated-by '\n' \  ##设定导入数据后每行的分隔符
--m 1 \   #并发的map数量为1,默认值为4
--null-string '\\N'    ##导入字段为空时,用指定字符进行替换

导入hive表

##导入hive表
##需要增加声明 --hive-import

sqoop import \
--connect jdbc:mysql://ip:3306/库名
--username root \
--password root@123 \
--table test_user_label
--hive-import \   ##导入hive表声明
--m 1 

增量导入hive表

①append模式,指定一个递增的列

--incremental append  --check-column num_id --last-value 0 
##增量导入append模式: 
##必须要有incremental,check-column,last-value
##而且append不能与--hive-等参数同时使用

sqoop import \
--connect jdbc:mysql://ip:3306/库名 \
--username root \
--password root@123 \
--table test_user_table \
--target-dir hdfs://summer/apps/hive/warehouse/a.db/user_label \
--fields-terminated-by '^' \ 
--incremental append \
--check-column id \
--last-value 1208

②lastmodified模式, 根据时间戳

--incremental lastmodified --check-column created --last-value '2018-02-01 11:0:00' 
##只导入create字段比'2018-02-01 11:0:00'更大的数据
##增量导入lastmodified模式: 
##lastmodified模式必须指定--append(追加)还是要--merge-key(合并)

sqoop import \
--connect jdbc:mysql://ip:3306/库名 \
--username root \
--password root@123 \
--table test_user_table \
--target-dir hdfs://summer/apps/hive/warehouse/a.db/user_label \
--fields-terminated-by '^' \ 
--incremental lastmodified \
--check-column last_modified \
--last-value "2017-09-28 22:20:38" \
--append     ##必须指定一个:append或merge-key

export

从hdfs(hive和hbase)导入到关系型数据库

sqoop export \
--connect jdbc:mysql://ip:3306/库名 \
--username root \
--password root@123 \
--table test_user_table \
--export-dir /user/news \
--input-fields-terminated-by "\t" \
--m 1

codegen

将关系型数据库中映射为一个java类,该类中有各列对应的各个字段

sqoop codegen \
--connect jdbc:mysql://ip:3306/库名 \
--username root \
--password root@123 \
--table user_test_table \
--bindir /home/test \
--class-name HelloSummer \

create-hive-table

生成与关系数据库结构对应的hive表结构

sqoop create-hive-table \    
--connect jdbc:mysql://ip:3306/库名 \
--username root \
--password root@123 \
--table user_test_table \     # 关系数据库表名
--hive-table hive_user_table  # 要创建的hive表名
参数 含义
--hive-home Hive的安装目录,可以通过该参数覆盖掉默认的Hive目录
--hive-overwrite 覆盖掉在Hive表中已经存在的数据
--create-hive-table 默认是false,如果目标表已经存在了,那么创建任务会失败
--hive-table 要创建的hive表
--table 关系数据库的表名

eval

快速运行下sql将结果显示在控制台

sqoop eval \
--connect jdbc:mysql://ip:3306/库名 \
--username root \
--password root@123 \
--query "select * from user limit 2"   # query后为查询的sql语句

import-all-tables

​ 将RDBMS中所有表导入hdfs,每个表对应一个hdfs目录

sqoop import-all-tables \
--connect jdbc:mysql://ip:3306/库名
--username root \
--password root@123 \
--warehouse /all_tables

job

生成一个sqoop任务,不会立即执行,需要手动执行

##生成一个job

sqoop job \
--create firstTestJob --import-all-tables \
--connect jdbc:mysql://ip:3306/库名 \
--username root \
--password root@123 \

##查看所有job
sqoop job \
--list


##执行一个job
sqoop job \
--exec firstTestJob             #exec后是要执行的job名

merge

将hdfs中不同目录下面的数据合并在一起放入指定目录中

sqoop merge \
--new-data /test/new \
--onto /test/old \
--target-dir /test/meged \
--jar-file /home/user/myUser.jar \
--class-name myUser \
--merge-key id

metastore

记录sqoop job的元数据信息,不启动则job元数据的存储目录为~/.sqoop,可在sqoop-site.xml中修改

##启动sqoop的metastore服务
sqoop metastore


## --shutdown 关闭metastore
posted @ 2022-01-27 10:10  等木鱼的猫  阅读(77)  评论(0编辑  收藏  举报