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