热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Hive的ADS层数据导出到MySQL/PostgreSQL

为了供前端去展示app层的数据,提高数据的查询效率,需要将hive中的数据导出到Mysql等关系型数据库中。创建MySQL数据库和表创建gmall_

为了供前端去展示app层的数据,提高数据的查询效率,需要将hive中的数据导出到Mysql等关系型数据库中。

创建MySQL数据库和表


创建gmall_report数据库

注:SQL语句

CREATE DATABASE `gmall_report` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

 创建表

(1)访客统计

DROP TABLE IF EXISTS ads_visit_stats;
CREATE TABLE `ads_visit_stats` (`dt` DATE NOT NULL COMMENT '统计日期',`is_new` VARCHAR(255) NOT NULL COMMENT '新老标识,1:新,0:老',`recent_days` INT NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`channel` VARCHAR(255) NOT NULL COMMENT '渠道',`uv_count` BIGINT(20) DEFAULT NULL COMMENT '日活(访问人数)',`duration_sec` BIGINT(20) DEFAULT NULL COMMENT '页面停留总时长',`avg_duration_sec` BIGINT(20) DEFAULT NULL COMMENT '一次会话,页面停留平均时长',`page_count` BIGINT(20) DEFAULT NULL COMMENT '页面总浏览数',`avg_page_count` BIGINT(20) DEFAULT NULL COMMENT '一次会话,页面平均浏览数',`sv_count` BIGINT(20) DEFAULT NULL COMMENT '会话次数',`bounce_count` BIGINT(20) DEFAULT NULL COMMENT '跳出数',`bounce_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '跳出率',PRIMARY KEY (`dt`,`recent_days`,`is_new`,`channel`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

 (2)页面路径分析

DROP TABLE IF EXISTS ads_page_path;
CREATE TABLE `ads_page_path` ( `dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`source` VARCHAR(255) DEFAULT NULL COMMENT '跳转起始页面',`target` VARCHAR(255) DEFAULT NULL COMMENT '跳转终到页面',`path_count` BIGINT(255) DEFAULT NULL COMMENT '跳转次数',UNIQUE KEY (`dt`,`recent_days`,`source`,`target`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(3)用户统计

DROP TABLE IF EXISTS ads_user_total;
CREATE TABLE `ads_user_total` ( `dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,0:累积值,1:最近1天,7:最近7天,30:最近30天',`new_user_count` BIGINT(20) DEFAULT NULL COMMENT '新注册用户数',`new_order_user_count` BIGINT(20) DEFAULT NULL COMMENT '新增下单用户数',`order_final_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '下单总金额',`order_user_count` BIGINT(20) DEFAULT NULL COMMENT '下单用户数',`no_order_user_count` BIGINT(20) DEFAULT NULL COMMENT '未下单用户数(具体指活跃用户中未下单用户)',PRIMARY KEY (`dt`,`recent_days`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

(4)用户变动统计

DROP TABLE IF EXISTS ads_user_change;
CREATE TABLE `ads_user_change` (`dt` DATE NOT NULL COMMENT '统计日期',`user_churn_count` BIGINT(20) DEFAULT NULL COMMENT '流失用户数',`user_back_count` BIGINT(20) DEFAULT NULL COMMENT '回流用户数',PRIMARY KEY (`dt`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

(5)用户行为漏斗分析

DROP TABLE IF EXISTS ads_user_action;
CREATE TABLE `ads_user_action` (`dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`home_count` BIGINT(20) DEFAULT NULL COMMENT '浏览首页人数',`good_detail_count` BIGINT(20) DEFAULT NULL COMMENT '浏览商品详情页人数',`cart_count` BIGINT(20) DEFAULT NULL COMMENT '加入购物车人数',`order_count` BIGINT(20) DEFAULT NULL COMMENT '下单人数',`payment_count` BIGINT(20) DEFAULT NULL COMMENT '支付人数',PRIMARY KEY (`dt`,`recent_days`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(6)用户留存率分析

DROP TABLE IF EXISTS ads_user_retention;
CREATE TABLE `ads_user_retention` ( `dt` DATE DEFAULT NULL COMMENT '统计日期',`create_date` VARCHAR(255) NOT NULL COMMENT '用户新增日期',`retention_day` BIGINT(20) NOT NULL COMMENT '截至当前日期留存天数',`retention_count` BIGINT(20) DEFAULT NULL COMMENT '留存用户数量',`new_user_count` BIGINT(20) DEFAULT NULL COMMENT '新增用户数量',`retention_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '留存率',PRIMARY KEY (`create_date`,`retention_day`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(7)订单统计

DROP TABLE IF EXISTS ads_order_total;CREATE TABLE `ads_order_total` ( `dt` DATE NOT NULL COMMENT '统计日期', `recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`order_count` BIGINT(255) DEFAULT NULL COMMENT '订单数', `order_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '订单金额', `order_user_count` BIGINT(255) DEFAULT NULL COMMENT '下单人数',PRIMARY KEY (`dt`,`recent_days`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(8)各省份订单统计

DROP TABLE IF EXISTS ads_order_by_province;
CREATE TABLE `ads_order_by_province` (`dt` DATE NOT NULL,`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`province_id` VARCHAR(255) NOT NULL COMMENT '统计日期',`province_name` VARCHAR(255) DEFAULT NULL COMMENT '省份名称',`area_code` VARCHAR(255) DEFAULT NULL COMMENT '地区编码',`iso_code` VARCHAR(255) DEFAULT NULL COMMENT '国际标准地区编码',`iso_code_3166_2` VARCHAR(255) DEFAULT NULL COMMENT '国际标准地区编码',`order_count` BIGINT(20) DEFAULT NULL COMMENT '订单数',`order_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '订单金额',PRIMARY KEY (`dt`, `recent_days` ,`province_id`) USING BTREE
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(9)品牌复购率

DROP TABLE IF EXISTS ads_repeat_purchase;
CREATE TABLE `ads_repeat_purchase` ( `dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`tm_id` VARCHAR(255) NOT NULL COMMENT '品牌ID',`tm_name` VARCHAR(255) DEFAULT NULL COMMENT '品牌名称',`order_repeat_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '复购率',PRIMARY KEY (`dt` ,`recent_days`,`tm_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(10)商品统计

DROP TABLE IF EXISTS ads_order_spu_stats;
CREATE TABLE `ads_order_spu_stats` (`dt` DATE NOT NULL COMMENT '统计日期',`recent_days` BIGINT(20) NOT NULL COMMENT '最近天数,1:最近1天,7:最近7天,30:最近30天',`spu_id` VARCHAR(255) NOT NULL COMMENT '商品ID',`spu_name` VARCHAR(255) DEFAULT NULL COMMENT '商品名称',`tm_id` VARCHAR(255) NOT NULL COMMENT '品牌ID',`tm_name` VARCHAR(255) DEFAULT NULL COMMENT '品牌名称',`category3_id` VARCHAR(255) NOT NULL COMMENT '三级品类ID',`category3_name` VARCHAR(255) DEFAULT NULL COMMENT '三级品类名称',`category2_id` VARCHAR(255) NOT NULL COMMENT '二级品类ID',`category2_name` VARCHAR(255) DEFAULT NULL COMMENT '二级品类名称',`category1_id` VARCHAR(255) NOT NULL COMMENT '一级品类ID',`category1_name` VARCHAR(255) NOT NULL COMMENT '一级品类名称',`order_count` BIGINT(20) DEFAULT NULL COMMENT '订单数',`order_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '订单金额', PRIMARY KEY (`dt`,`recent_days`,`spu_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

(11)活动统计

DROP TABLE IF EXISTS ads_activity_stats;
CREATE TABLE `ads_activity_stats` (`dt` DATE NOT NULL COMMENT '统计日期',`activity_id` VARCHAR(255) NOT NULL COMMENT '活动ID',`activity_name` VARCHAR(255) DEFAULT NULL COMMENT '活动名称',`start_date` DATE DEFAULT NULL COMMENT '开始日期',`order_count` BIGINT(11) DEFAULT NULL COMMENT '参与活动订单数',`order_original_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '参与活动订单原始金额',`order_final_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '参与活动订单最终金额',`reduce_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '优惠金额',`reduce_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '补贴率',PRIMARY KEY (`dt`,`activity_id` )
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

(12)优惠券统计

DROP TABLE IF EXISTS ads_coupon_stats;
CREATE TABLE `ads_coupon_stats` (`dt` DATE NOT NULL COMMENT '统计日期',`coupon_id` VARCHAR(255) NOT NULL COMMENT '优惠券ID',`coupon_name` VARCHAR(255) DEFAULT NULL COMMENT '优惠券名称',`start_date` DATE DEFAULT NULL COMMENT '开始日期', `rule_name` VARCHAR(200) DEFAULT NULL COMMENT '优惠规则',`get_count` BIGINT(20) DEFAULT NULL COMMENT '领取次数',`order_count` BIGINT(20) DEFAULT NULL COMMENT '使用(下单)次数',`expire_count` BIGINT(20) DEFAULT NULL COMMENT '过期次数',`order_original_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '使用优惠券订单原始金额',`order_final_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '使用优惠券订单最终金额',`reduce_amount` DECIMAL(16,2) DEFAULT NULL COMMENT '优惠金额',`reduce_rate` DECIMAL(16,2) DEFAULT NULL COMMENT '补贴率',PRIMARY KEY (`dt`,`coupon_id` )
) ENGINE=INNODB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

Sqoop导出脚本

1)编写Sqoop导出脚本

在/home/muzili/bin目录下创建脚本hdfs_to_mysql.sh

[muzili@hadoop102 bin]$ vim hdfs_to_mysql.sh

在脚本中填写如下内容:

#!/bin/bashhive_db_name=gmall
mysql_db_name=gmall_reportexport_data() {
/opt/module/sqoop/bin/sqoop export \
--connect "jdbc:mysql://hadoop102:3306/${mysql_db_name}?useUnicode=true&characterEncoding=utf-8" \
--username root \
--password 000000 \
--table $1 \
--num-mappers 1 \
--export-dir /warehouse/$hive_db_name/ads/$1 \
--input-fields-terminated-by "\t" \
--update-mode allowinsert \
--update-key $2 \
--input-null-string '\\N' \
--input-null-non-string '\\N'
}case $1 in"ads_activity_stats" )export_data "ads_activity_stats" "dt,activity_id";;"ads_coupon_stats" )export_data "ads_coupon_stats" "dt,coupon_id";;"ads_order_by_province" )export_data "ads_order_by_province" "dt,recent_days,province_id";;"ads_order_spu_stats" )export_data "ads_order_spu_stats" "dt,recent_days,spu_id";;"ads_order_total" )export_data "ads_order_total" "dt,recent_days";;"ads_page_path" )export_data "ads_page_path" "dt,recent_days,source,target";;"ads_repeat_purchase" )export_data "ads_repeat_purchase" "dt,recent_days,tm_id";;"ads_user_action" )export_data "ads_user_action" "dt,recent_days";;"ads_user_change" )export_data "ads_user_change" "dt";;"ads_user_retention" )export_data "ads_user_retention" "create_date,retention_day";;"ads_user_total" )export_data "ads_user_total" "dt,recent_days";;"ads_visit_stats" )export_data "ads_visit_stats" "dt,recent_days,is_new,channel";;"all" )export_data "ads_activity_stats" "dt,activity_id"export_data "ads_coupon_stats" "dt,coupon_id"export_data "ads_order_by_province" "dt,recent_days,province_id"export_data "ads_order_spu_stats" "dt,recent_days,spu_id"export_data "ads_order_total" "dt,recent_days"export_data "ads_page_path" "dt,recent_days,source,target"export_data "ads_repeat_purchase" "dt,recent_days,tm_id"export_data "ads_user_action" "dt,recent_days"export_data "ads_user_change" "dt"export_data "ads_user_retention" "create_date,retention_day"export_data "ads_user_total" "dt,recent_days"export_data "ads_visit_stats" "dt,recent_days,is_new,channel";;
esac

 关于导出update还是insert的问题

  • --update-mode:

updateonly   只更新,无法插入新数据

        allowinsert   允许新增 

  • --update-key:允许更新的情况下,指定哪些字段匹配视为同一条数据,进行更新而不增加。多个字段用逗号分隔。

  • --input-null-string和--input-null-non-string:

分别表示,将字符串列和非字符串列的空串和“null”转义。

官网地址:http://sqoop.apache.org/docs/1.4.6/SqoopUserGuide.html

Sqoop will by default import NULL values as string null. Hive is however using string \N to denote NULL values and therefore predicates dealing with NULL(like IS NULL) will not work correctly. You should append parameters --null-string and --null-non-string in case of import job or --input-null-string and --input-null-non-string in case of an export job if you wish to properly preserve NULL values. Because sqoop is using those parameters in generated code, you need to properly escape value \N to \\N:

Hive中的Null在底层是以“\N”来存储,而MySQL中的Null在底层就是Null,为了保证数据两端的一致性。在导出数据时采用--input-null-string和--input-null-non-string两个参数。导入数据时采用--null-string和--null-non-string。

2)执行Sqoop导出脚本

[muzili@hadoop102 bin]$ chmod 777 hdfs_to_mysql.sh

[muzili@hadoop102 bin]$ hdfs_to_mysql.sh all


推荐阅读
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 开源Keras Faster RCNN模型介绍及代码结构解析
    本文介绍了开源Keras Faster RCNN模型的环境需求和代码结构,包括FasterRCNN源码解析、RPN与classifier定义、data_generators.py文件的功能以及损失计算。同时提供了该模型的开源地址和安装所需的库。 ... [详细]
  • 如何使用Python从工程图图像中提取底部的方法?
    本文介绍了使用Python从工程图图像中提取底部的方法。首先将输入图片转换为灰度图像,并进行高斯模糊和阈值处理。然后通过填充潜在的轮廓以及使用轮廓逼近和矩形核进行过滤,去除非矩形轮廓。最后通过查找轮廓并使用轮廓近似、宽高比和轮廓区域进行过滤,隔离所需的底部轮廓,并使用Numpy切片提取底部模板部分。 ... [详细]
author-avatar
冠吸柏芝霆疯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有