分享

大数据项目之电商数仓(总结)(二):系统业务数据仓库

问题导读:
1、关系建模与维度建模如何理解?
2、如何配置Hadoop支持Snappy压缩?
3、业务数据如何生成?
4、如何将业务数据导入数仓?


上一篇:大数据项目之电商数仓(总结)(一):系统业务数据仓库

2.4 关系建模与维度建模
关系模型
2021-01-06_204445.jpg

关系模型主要应用与OLTP系统中,为了保证数据的一致性以及避免冗余,所以大部分业务系统的表都是遵循第三范式的。


维度模型
2021-01-06_204517.jpg

维度模型主要应用于OLAP系统中,因为关系模型虽然冗余少,但是在大规模数据,跨表分析统计查询过程中,会造成多表关联,这会大大降低执行效率。
所以把相关各种表整理成两种:事实表和维度表两种。所有维度表围绕着事实表进行解释。


OLAP与OLTP对比
2021-01-06_204558.jpg

雪花模型、星型模型和星座模型
在维度建模的基础上又分为三种模型:星型模型、雪花模型、星座模型

2021-01-06_204639.jpg

2021-01-06_204704.jpg

第3章 数仓搭建
3.0 配置Hadoop支持Snappy压缩
1)将编译后支持Snappy压缩的Hadoop jar包解压缩,并将lib/native目录中所有文件上传到hadoop102的/opt/module/hadoop-2.7.2/lib/native目录,并分发到hadoop103 hadoop104。
2)重新启动Hadoop。
3)检查支持的压缩方式
  1. [kgg@hadoop102 native]$ hadoop checknative
  2. hadoop:  true /opt/module/hadoop-2.7.2/lib/native/libhadoop.so
  3. zlib:    true /lib64/libz.so.1
  4. snappy:  true /opt/module/hadoop-2.7.2/lib/native/libsnappy.so.1
  5. lz4:     true revision:99
  6. bzip2:   false
复制代码


3.1 业务数据生成
3.1.1 建表语句
1)通过SQLyog创建数据库gmall

2021-01-06_204740.jpg

2)设置数据库编码
2021-01-06_204807.jpg

3)导入建表语句(1建表脚本)
2021-01-06_204834.jpg

2021-01-06_204912.jpg

4)重复步骤3的导入方式,依次导入:2商品分类数据插入脚本、3函数脚本、4存储过程脚本。

3.1.2 生成业务数据
1)生成业务数据函数说明
  1.     init_data ( do_date_string VARCHAR(20) , order_incr_num INT, user_incr_num INT , sku_num INT , if_truncate BOOLEAN  ):
  2.     参数一:do_date_string生成数据日期
  3.     参数二:order_incr_num订单id个数
  4.     参数三:user_incr_num用户id个数
  5.     参数四:sku_num商品sku个数
  6.     参数五:if_truncate是否删除数据
复制代码

2)案例测试:
(1)需求:生成日期2019年2月10日数据、订单1000个、用户200个、商品sku300个、删除原始数据。

2021-01-06_204940.jpg

  1. CALL init_data('2019-02-10',1000,200,300,TRUE);
复制代码

(2)查询生成数据结果
  1. SELECT * from base_category1;
  2. SELECT * from base_category2;
  3. SELECT * from base_category3;
  4. SELECT * from order_info;
  5. SELECT * from order_detail;
  6. SELECT * from sku_info;
  7. SELECT * from user_info;
  8. SELECT * from payment_info;
复制代码

3.2 业务数据导入数仓
2021-01-06_205011.jpg

3.2.1 Sqoop安装
详见尚硅谷大数据技术之Sqoop


3.2.2 Sqoop导入命令
  1. /opt/module/sqoop/bin/sqoop import \
  2. --connect \
  3. --username \
  4. --password \
  5. --target-dir \
  6. --delete-target-dir \
  7. --num-mappers \
  8. --fields-terminated-by \
  9. --query "$2" ' and $CONDITIONS;'
复制代码

3.2.3 分析表

2021-01-06_205054.jpg

3.2.4 Sqoop定时导入脚本
1)在/home/kgg/bin目录下创建脚本sqoop_import.sh

[kgg@hadoop102 bin]$ vim sqoop_import.sh
  1.     在脚本中填写如下内容
  2. #!/bin/bash
  3. db_date=$2
  4. echo $db_date
  5. db_name=gmall
  6. import_data() {
  7. /opt/module/sqoop/bin/sqoop import \
  8. --connect jdbc:mysql://hadoop102:3306/$db_name \
  9. --username root \
  10. --password 000000 \
  11. --target-dir /origin_data/$db_name/db/$1/$db_date \
  12. --delete-target-dir \
  13. --num-mappers 1 \
  14. --fields-terminated-by "\t" \
  15. --query "$2"' and $CONDITIONS;'
  16. }
  17. import_sku_info(){
  18.   import_data "sku_info" "select
  19. id, spu_id, price, sku_name, sku_desc, weight, tm_id,
  20. category3_id, create_time
  21.   from sku_info where 1=1"
  22. }
  23. import_user_info(){
  24.   import_data "user_info" "select
  25. id, name, birthday, gender, email, user_level,
  26. create_time
  27. from user_info where 1=1"
  28. }
  29. import_base_category1(){
  30.   import_data "base_category1" "select
  31. id, name from base_category1 where 1=1"
  32. }
  33. import_base_category2(){
  34.   import_data "base_category2" "select
  35. id, name, category1_id from base_category2 where 1=1"
  36. }
  37. import_base_category3(){
  38.   import_data "base_category3" "select id, name, category2_id from base_category3 where 1=1"
  39. }
  40. import_order_detail(){
  41.   import_data   "order_detail"   "select
  42.     od.id,
  43.     order_id,
  44.     user_id,
  45.     sku_id,
  46.     sku_name,
  47.     order_price,
  48.     sku_num,
  49.     o.create_time  
  50.   from order_info o, order_detail od
  51.   where o.id=od.order_id
  52.   and DATE_FORMAT(create_time,'%Y-%m-%d')='$db_date'"
  53. }
  54. import_payment_info(){
  55.   import_data "payment_info"   "select
  56.     id,  
  57.     out_trade_no,
  58.     order_id,
  59.     user_id,
  60.     alipay_trade_no,
  61.     total_amount,  
  62.     subject,
  63.     payment_type,
  64.     payment_time
  65.   from payment_info
  66.   where DATE_FORMAT(payment_time,'%Y-%m-%d')='$db_date'"
  67. }
  68. import_order_info(){
  69.   import_data   "order_info"   "select
  70.     id,
  71.     total_amount,
  72.     order_status,
  73.     user_id,
  74.     payment_way,
  75.     out_trade_no,
  76.     create_time,
  77.     operate_time  
  78.   from order_info
  79.   where (DATE_FORMAT(create_time,'%Y-%m-%d')='$db_date' or DATE_FORMAT(operate_time,'%Y-%m-%d')='$db_date')"
  80. }
  81. case $1 in
  82.   "base_category1")
  83.      import_base_category1
  84. ;;
  85.   "base_category2")
  86.      import_base_category2
  87. ;;
  88.   "base_category3")
  89.      import_base_category3
  90. ;;
  91.   "order_info")
  92.      import_order_info
  93. ;;
  94.   "order_detail")
  95.      import_order_detail
  96. ;;
  97.   "sku_info")
  98.      import_sku_info
  99. ;;
  100.   "user_info")
  101.      import_user_info
  102. ;;
  103.   "payment_info")
  104.      import_payment_info
  105. ;;
  106.    "all")
  107.    import_base_category1
  108.    import_base_category2
  109.    import_base_category3
  110.    import_order_info
  111.    import_order_detail
  112.    import_sku_info
  113.    import_user_info
  114.    import_payment_info
  115. ;;
  116. esac
复制代码

2)增加脚本执行权限
  1. [kgg@hadoop102 bin]$ chmod 777 sqoop_import.sh
复制代码


3)执行脚本导入数据
  1. [kgg@hadoop102 bin]$ sqoop_import.sh all 2019-02-10
复制代码

4)在SQLyog中生成2019年2月11日数据
  1. CALL init_data('2019-02-11',1000,200,300,TRUE);
复制代码

5)执行脚本导入数据
  1. [kgg@hadoop102 bin]$ sqoop_import.sh all 2019-02-11
复制代码


3.2.5 Sqoop导入数据异常处理
1)问题描述:执行Sqoop导入数据脚本时,发生如下异常
  1. java.sql.SQLException: Streaming result set com.mysql.jdbc.RowDataDynamic@65d6b83b is still active. No statements may be issued when any streaming result sets are open and in use on a given connection. Ensure that you have called .close() on any active streaming result sets before attempting more queries.
  2.     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:930)
  3.     at com.mysql.jdbc.MysqlIO.checkForOutstandingStreamingData(MysqlIO.java:2646)
  4.     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1861)
  5.     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
  6.     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548)
  7.     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2477)
  8.     at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1422)
  9.     at com.mysql.jdbc.ConnectionImpl.getMaxBytesPerChar(ConnectionImpl.java:2945)
  10.     at com.mysql.jdbc.Field.getMaxBytesPerCharacter(Field.java:582)
复制代码

2)问题解决方案:增加如下导入参数
  1. --driver com.mysql.jdbc.Driver \
复制代码

最新经典文章,欢迎关注公众号



没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条