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