大数据【企业级360°全方位用户画像】业务数据调研及ETL

写在前面: 博主是一名软件工程系大数据应用开发专业大二的学生,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:http://alices.ibilibili.xyz/ , 博客主页:https://alice.blog.csdn.net/
尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为一天的生活就是一生的缩影。我希望在最美的年华,做最好的自己

        之前关于用户画像项目部分的讲解大多停留在理论层面,本篇我们正式开始对该项目中所使用到的业务数据进行调研和ETL处理
大数据【企业级360°全方位用户画像】业务数据调研及ETL_第1张图片

文章目录

    • 业务数据调研及ETL
      • 1、电商数据(数据源)
        • 1.1、MySQL数据库
        • 1.2、表的结构
          • 1.2.1、数据库Database
          • 1.2.2、订单商品信息表:tbl_goods
          • 1.2.3、会员信息表:tbl_users
          • 1.2.4、行为日志表:tbl_logs
          • 1.2.5、订单数据表:tbl_orders
        • 1.3、Hive 数据仓库
          • 1.3.1、 创建表
          • 1.3.2、导入数据至Hive表
      • 2、数据导入(Import)
        • 2.1、HBase 表设计
        • 2.2、Sqoop直接导入
        • 2.3、HBase ImportTSV
        • 2.4、HBase Bulkload
    • 小结


业务数据调研及ETL

        整个用户画像(UserProfile)项目中,数据、业务及技术流程图如下所示:

大数据【企业级360°全方位用户画像】业务数据调研及ETL_第2张图片
        其中数据源存储在业务系统数据库:MySQL 数据库中,采用SQOOP全量/增量将数据抽取到HDFS(Hive表中),通过转换为HFile文件加载到HBase表。

大数据【企业级360°全方位用户画像】业务数据调研及ETL_第3张图片
思考?

1)、为什么将订单相关数据【订单数据和订单商品数据】存储到HBase表中????
	特点:数据量比较大
	存储HBase:存储海量数据、查询检索
2)、实际项目来说【访问行为日志】数据存储到Hive表中
	数据仓库分层:
		ODS层、DW层和APP3)、特殊:模拟的所有业务数据存储在RDBMs表中,为了简化整个项目开发,重点在于标签开发,将所有数据迁移到HBase表中。

1、电商数据(数据源)

        所有的业务数据,都是编写程序模拟产生的,直接保存到MySQL数据库的表中。

1.1、MySQL数据库

        在数据库【tags_dat】中包含四张表:

1)、订单商品表:tbl_goods
2)、用户表:tbl_users
3)、行为日志表:tbl_logs
4)、订单数据表:tbl_orders

大数据【企业级360°全方位用户画像】业务数据调研及ETL_第4张图片

1.2、表的结构

        电商系统中四张表的结构如下,数据存储在MySQL数据库中(为了方便模拟业务数据,存储MySQL表)。

1.2.1、数据库Database

        数据库 tags_dat,构建语句如下:

mysql> show create database tags_dat ;
+----------+----------------------------------------------------------+
| tags_dat | CREATE DATABASE `tags_dat` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------+
1.2.2、订单商品信息表:tbl_goods

         电商网站中订单商品goods基本信息表,总共97个字段,除去主键ID外96个字段。

CREATE TABLE `tbl_goods` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `siteId` int(10) unsigned NOT NULL,
  `isTest` tinyint(1) unsigned NOT NULL COMMENT '是否是测试网单',
  `hasRead` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已读,测试字段',
  `supportOneDayLimit` tinyint(1) unsigned NOT NULL COMMENT '是否支持24小时限时达',
  `orderId` int(10) unsigned NOT NULL,
  `cOrderSn` varchar(50) NOT NULL COMMENT 'child order sn 子订单编码 C0919293',
  `isBook` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否是预订网单',
  `cPaymentStatus` smallint(3) unsigned NOT NULL COMMENT '子订单付款状态',
  `cPayTime` int(10) unsigned NOT NULL COMMENT '子订单付款时间',
  `productType` varchar(50) NOT NULL COMMENT '商品类型',
  `productId` int(10) unsigned NOT NULL COMMENT '抽象商品id(可能是商品规格,也可能是套装,由商品类型决定)',
  `productName` varchar(100) NOT NULL COMMENT '商品名称:可能是商品名称加颜色规格,也可能是套装名称',
  `sku` varchar(60) NOT NULL COMMENT '货号',
  `price` decimal(10,2) unsigned NOT NULL COMMENT '商品单价',
  `number` smallint(5) unsigned NOT NULL COMMENT '数量',
  `lockedNumber` int(10) unsigned NOT NULL COMMENT '曾经锁定的库存数量',
  `unlockedNumber` int(10) unsigned NOT NULL COMMENT '曾经解锁的库存数量',
  `productAmount` decimal(10,2) NOT NULL COMMENT '此字段专为同步外部订单而加,商品总金额=price*number+shippingFee-优惠金额,但优惠金额没在本系统存储',
  `balanceAmount` decimal(10,2) unsigned NOT NULL COMMENT '余额扣减',
  `couponAmount` decimal(10,2) unsigned NOT NULL COMMENT '优惠券抵扣金额',
  `esAmount` decimal(10,2) unsigned NOT NULL COMMENT '节能补贴金额',
  `giftCardNumberId` int(10) unsigned NOT NULL COMMENT '礼品卡号ID,关联GiftCardNumbers表的主键',
  `usedGiftCardAmount` decimal(10,2) unsigned NOT NULL COMMENT '礼品卡抵用的金额',
  `couponLogId` int(10) unsigned NOT NULL COMMENT '使用的优惠券记录ID',
  `activityPrice` decimal(10,2) unsigned NOT NULL COMMENT '活动价,当有活动价时price的值来源于activityPrice',
  `activityId` int(10) unsigned NOT NULL COMMENT '活动ID',
  `cateId` int(11) NOT NULL COMMENT '分类ID',
  `brandId` int(11) NOT NULL COMMENT '品牌ID',
  `netPointId` int(10) NOT NULL COMMENT '网点id',
  `shippingFee` decimal(10,2) NOT NULL COMMENT '配送费用',
  `settlementStatus` tinyint(1) NOT NULL COMMENT '结算状态0 未结算 1已结算 ',
  `receiptOrRejectTime` int(10) unsigned NOT NULL COMMENT '确认收货时间或拒绝收货时间',
  `isWmsSku` tinyint(1) NOT NULL COMMENT '是否淘宝小家电',
  `sCode` varchar(10) NOT NULL COMMENT '库位编码',
  `tsCode` varchar(10) NOT NULL DEFAULT '' COMMENT '转运库房编码',
  `tsShippingTime` int(11) NOT NULL DEFAULT '0' COMMENT '转运时效(小时)',
  `status` smallint(3) NOT NULL COMMENT '状态',
  `productSn` varchar(60) NOT NULL COMMENT '商品条形码',
  `invoiceNumber` varchar(60) NOT NULL COMMENT '运单号',
  `expressName` varchar(255) NOT NULL COMMENT '快递公司',
  `invoiceExpressNumber` varchar(60) NOT NULL COMMENT '发票快递单号',
  `postMan` varchar(20) NOT NULL COMMENT '送货人',
  `postManPhone` varchar(15) NOT NULL COMMENT '送货人电话',
  `isNotice` smallint(5) NOT NULL COMMENT '是否开启预警',
  `noticeType` smallint(5) NOT NULL,
  `noticeRemark` varchar(255) NOT NULL,
  `noticeTime` varchar(8) NOT NULL COMMENT '预警时间',
  `shippingTime` int(10) NOT NULL COMMENT '发货时间',
  `lessOrderSn` varchar(50) NOT NULL COMMENT 'less 订单号',
  `waitGetLesShippingInfo` tinyint(1) unsigned NOT NULL COMMENT '是否等待获取LES物流配送节点信息',
  `getLesShippingCount` int(10) unsigned NOT NULL COMMENT '已获取LES配送节点信息的次数',
  `outping` varchar(20) NOT NULL COMMENT '出库凭证',
  `lessShipTime` int(10) NOT NULL COMMENT 'less出库时间',
  `closeTime` int(10) unsigned NOT NULL COMMENT '网单完成关闭或取消关闭时间',
  `isReceipt` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '是否需要发票',
  `isMakeReceipt` int(1) NOT NULL DEFAULT '1' COMMENT '开票状态',
  `receiptNum` text NOT NULL COMMENT '发票号',
  `receiptAddTime` varchar(30) NOT NULL COMMENT '开票时间',
  `makeReceiptType` tinyint(3) NOT NULL COMMENT '开票类型 0 初始值 1 库房开票  2 共享开票',
  `shippingMode` varchar(60) NOT NULL COMMENT '物流模式,值为B2B2C或B2C',
  `lastTimeForShippingMode` int(10) unsigned NOT NULL COMMENT '最后修改物流模式的时间',
  `lastEditorForShippingMode` varchar(200) NOT NULL COMMENT '最后修改物流模式的管理员',
  `systemRemark` text NOT NULL COMMENT '系统备注,不给用户显示',
  `tongshuaiWorkId` int(11) NOT NULL DEFAULT '-1' COMMENT '统帅定制作品ID',
  `orderPromotionId` int(10) unsigned NOT NULL COMMENT '下单立减活动ID',
  `orderPromotionAmount` decimal(10,2) unsigned NOT NULL COMMENT '下单立减金额',
  `externalSaleSettingId` int(10) unsigned NOT NULL COMMENT '淘宝套装设置ID',
  `recommendationId` int(10) unsigned NOT NULL COMMENT '推荐购买ID',
  `hasSendAlertNum` tinyint(1) unsigned NOT NULL COMMENT '是否已发送了购买数据报警邮件(短信)',
  `isNoLimitStockProduct` tinyint(1) unsigned NOT NULL COMMENT '是否是无限制库存量的商品',
  `hpRegisterDate` int(11) DEFAULT '0' COMMENT 'HP注册时间',
  `hpFailDate` int(11) DEFAULT '0' COMMENT 'HP派工失败时间',
  `hpFinishDate` int(11) DEFAULT '0' COMMENT 'HP派工成功时间',
  `hpReservationDate` int(11) NOT NULL DEFAULT '0' COMMENT 'HP回传预约送货时间',
  `shippingOpporunity` tinyint(4) NOT NULL DEFAULT '0' COMMENT '活动订单发货时机,0定金发货 1尾款发货',
  `isTimeoutFree` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否超时免单 0未设置 1是 2否',
  `itemShareAmount` decimal(10,2) DEFAULT '0.00' COMMENT '订单优惠价格分摊',
  `lessShipTInTime` int(10) DEFAULT '0' COMMENT 'less转运入库时间',
  `lessShipTOutTime` int(10) DEFAULT '0' COMMENT 'less转运出库时间',
  `cbsSecCode` varchar(10) DEFAULT '' COMMENT 'cbs库位',
  `points` int(11) DEFAULT '0' COMMENT '网单使用积分',
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  `splitFlag` tinyint(3) unsigned NOT NULL COMMENT '拆单标志,0:未拆单;1:拆单后旧单;2:拆单后新单',
  `splitRelateCOrderSn` varchar(50) NOT NULL COMMENT '拆单关联单号',
  `channelId` tinyint(4) DEFAULT '0' COMMENT '区分EP和商城',
  `activityId2` int(11) NOT NULL DEFAULT '0' COMMENT '运营活动id',
  `pdOrderStatus` int(4) NOT NULL DEFAULT '0' COMMENT '日日单状态',
  `omsOrderSn` varchar(20) NOT NULL DEFAULT '' COMMENT '集团OMS单号',
  `couponCode` varchar(20) NOT NULL DEFAULT '' COMMENT '优惠码编码',
  `couponCodeValue` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠码优惠金额',
  `storeId` int(10) unsigned NOT NULL DEFAULT '0',
  `storeType` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '店铺类型',
  `stockType` varchar(10) NOT NULL DEFAULT 'WA',
  `o2oType` tinyint(3) unsigned NOT NULL DEFAULT '1' COMMENT 'o2o网单类型1非O2O网单2线下用户分销商城3商城分销旗舰店4创客',
  `brokerageType` varchar(100) DEFAULT NULL,
  `ogColor` varchar(30) DEFAULT NULL COMMENT '算法预留字段',
  PRIMARY KEY (`id`),
  KEY `orderId` (`orderId`),
  KEY `sCode` (`sCode`),
  KEY `cOrderSn` (`cOrderSn`),
  KEY `netPointId` (`netPointId`),
  KEY `isNotice` (`isNotice`),
  KEY `noticeTime` (`noticeTime`),
  KEY `closeTime` (`closeTime`),
  KEY `cPayTime` (`cPayTime`),
  KEY `productId` (`productId`),
  KEY `activityId` (`activityId`),
  KEY `idx_OrderProducts_cPaymentStatus_status` (`cPaymentStatus`,`status`),
  KEY `idx_OrderProducts_waitGetLesShippingInfo` (`waitGetLesShippingInfo`),
  KEY `idx_OrderProducts_status` (`status`),
  KEY `idx_OrderProducts_sku` (`sku`),
  KEY `ix_OrderProducts_lessShipTime` (`lessShipTime`),
  KEY `modified` (`modified`),
  KEY `ix_OrderProducts_receiptAddTime` (`receiptAddTime`),
  KEY `idx_pdOrderStatus` (`pdOrderStatus`),
  KEY `idx_lessShipTInTime` (`lessShipTInTime`)
) ENGINE=InnoDB AUTO_INCREMENT=3853572 DEFAULT CHARSET=utf8;
1.2.3、会员信息表:tbl_users

        电商网站中用户基本信息表,总共38个字段,除去主键ID外共37个字段信息。

CREATE TABLE `tbl_users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `siteId` int(10) unsigned NOT NULL,
  `avatarImageFileId` varchar(255) DEFAULT NULL,
  `email` varchar(120) DEFAULT NULL,
  `username` varchar(60) NOT NULL COMMENT '用户名',
  `password` varchar(32) DEFAULT NULL COMMENT '密码',
  `salt` varchar(10) DEFAULT NULL COMMENT '扰码',
  `registerTime` int(10) unsigned NOT NULL COMMENT '注册时间',
  `lastLoginTime` int(10) unsigned DEFAULT NULL COMMENT '最后登录时间',
  `lastLoginIp` varchar(15) DEFAULT NULL COMMENT '最后登录ip',
  `memberRankId` int(10) unsigned DEFAULT NULL COMMENT '特殊会员等级id,0表示非特殊会员等级',
  `bigCustomerId` int(10) unsigned DEFAULT NULL COMMENT '所属的大客户ID',
  `lastAddressId` int(10) unsigned DEFAULT NULL COMMENT '上次使用的收货地址',
  `lastPaymentCode` varchar(20) DEFAULT NULL COMMENT '上次使用的支付方式',
  `gender` tinyint(3) unsigned DEFAULT NULL COMMENT '性别:0保密1男2女',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `qq` varchar(20) DEFAULT NULL,
  `job` varchar(60) DEFAULT NULL COMMENT '职业;1学生、2公务员、3军人、4警察、5教师、6白领',
  `mobile` varchar(15) DEFAULT NULL COMMENT '手机',
  `politicalFace` int(1) unsigned DEFAULT NULL COMMENT '政治面貌:1群众、2党员、3无党派人士',
  `nationality` varchar(20) DEFAULT NULL COMMENT '国籍:1中国大陆、2中国香港、3中国澳门、4中国台湾、5其他',
  `validateCode` varchar(32) DEFAULT NULL COMMENT '找回密码时的验证code',
  `pwdErrCount` tinyint(3) DEFAULT NULL COMMENT '密码输入错误次数',
  `source` varchar(20) DEFAULT NULL COMMENT '会员来源',
  `marriage` varchar(60) DEFAULT NULL COMMENT '婚姻状况:1未婚、2已婚、3离异',
  `money` decimal(15,2) DEFAULT NULL COMMENT '账户余额',
  `moneyPwd` varchar(32) DEFAULT NULL COMMENT '余额支付密码',
  `isEmailVerify` tinyint(1) DEFAULT NULL COMMENT '是否验证email',
  `isSmsVerify` tinyint(1) DEFAULT NULL COMMENT '是否验证短信',
  `smsVerifyCode` varchar(30) DEFAULT NULL COMMENT '邮件验证码',
  `emailVerifyCode` varchar(30) DEFAULT NULL COMMENT '短信验证码',
  `verifySendCoupon` tinyint(1) DEFAULT NULL COMMENT '是否验证发送优惠券',
  `canReceiveEmail` tinyint(1) DEFAULT NULL COMMENT '是否接收邮件',
  `modified` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  `channelId` tinyint(4) DEFAULT '0' COMMENT '??EP???',
  `grade_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '等级ID',
  `nick_name` varchar(60) NOT NULL DEFAULT '' COMMENT '昵称',
  `is_blackList` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否黑名单 : 0:非黑名单  1:黑名单',
  PRIMARY KEY (`id`),
  KEY `siteId` (`siteId`,`email`),
  KEY `memberRankId` (`memberRankId`)
) ENGINE=InnoDB AUTO_INCREMENT=951 DEFAULT CHARSET=utf8;
1.2.4、行为日志表:tbl_logs

         电商网站中用户浏览网站访问行为日志数据(浏览数据),总共11个字段,此类数据属于最多。

CREATE TABLE `tbl_logs` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `log_id` varchar(50) DEFAULT NULL,
  `remote_ip` varchar(50) DEFAULT NULL,
  `site_global_ticket` varchar(250) DEFAULT NULL,
  `site_global_session` varchar(250) DEFAULT NULL,
  `global_user_id` varchar(50) DEFAULT NULL,
  `cookie_text` mediumtext,
  `user_agent` varchar(250) DEFAULT NULL,
  `ref_url` varchar(250) DEFAULT NULL,
  `loc_url` varchar(250) DEFAULT NULL,
  `log_time` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `log_time` (`log_time`)
) ENGINE=MyISAM AUTO_INCREMENT=1160286 DEFAULT CHARSET=utf8;
1.2.5、订单数据表:tbl_orders

        电商网站中用户购买物品下单的订单数据,总共112个字段,记录每个订单详细信息。

CREATE TABLE `tbl_orders` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `siteId` int(10) unsigned NOT NULL,
  `isTest` tinyint(1) unsigned NOT NULL COMMENT '是否是测试订单',
  `hasSync` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否已同步(临时添加)',
  `isBackend` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '是否为后台添加的订单',
  `isBook` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '是否为后台添加的订单',
  `isCod` tinyint(1) unsigned NOT NULL COMMENT '是否是货到付款订单',
  `notAutoConfirm` tinyint(1) unsigned NOT NULL COMMENT '是否是非自动确认订单',
  `isPackage` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否为套装订单',
  `packageId` int(10) unsigned NOT NULL COMMENT '套装ID',
  `orderSn` varchar(50) NOT NULL COMMENT '订单号',
  `relationOrderSn` varchar(50) NOT NULL COMMENT '关联订单编号',
  `memberId` int(10) unsigned NOT NULL COMMENT '会员id',
  `predictId` int(10) unsigned NOT NULL COMMENT '会员购买预测ID',
  `memberEmail` varchar(120) NOT NULL COMMENT '会员邮件',
  `addTime` int(10) unsigned NOT NULL,
  `syncTime` int(10) unsigned NOT NULL COMMENT '同步到此表中的时间',
  `orderStatus` smallint(3) NOT NULL COMMENT '订单状态',
  `payTime` int(10) unsigned NOT NULL COMMENT '在线付款时间',
  `paymentStatus` smallint(3) unsigned NOT NULL COMMENT '付款状态:0 买家未付款 1 买家已付款 ',
  `receiptConsignee` varchar(20) NOT NULL COMMENT '发票收件人',
  `receiptAddress` varchar(255) NOT NULL COMMENT '发票地址',
  `receiptZipcode` varchar(20) NOT NULL COMMENT '发票邮编',
  `receiptMobile` varchar(30) NOT NULL COMMENT '发票联系电话',
  `productAmount` decimal(10,2) unsigned NOT NULL COMMENT '商品金额,等于订单中所有的商品的单价乘以数量之和',
  `orderAmount` decimal(10,2) unsigned NOT NULL COMMENT '订单总金额,等于商品总金额+运费',
  `paidBalance` decimal(10,2) unsigned NOT NULL COMMENT '余额账户支付总金额',
  `giftCardAmount` decimal(10,2) unsigned NOT NULL COMMENT '礼品卡抵用金额',
  `paidAmount` decimal(10,2) unsigned NOT NULL COMMENT '已支付金额',
  `shippingAmount` decimal(10,2) NOT NULL COMMENT '淘宝运费',
  `totalEsAmount` decimal(10,2) unsigned NOT NULL COMMENT '网单中总的节能补贴金额之和',
  `usedCustomerBalanceAmount` decimal(10,2) unsigned NOT NULL COMMENT '使用的客户的余额支付金额',
  `customerId` int(10) unsigned NOT NULL COMMENT '用余额支付的客户ID',
  `bestShippingTime` varchar(100) NOT NULL COMMENT '最佳配送时间描述',
  `paymentCode` varchar(20) NOT NULL COMMENT '支付方式code',
  `payBankCode` varchar(20) NOT NULL COMMENT '网银代码',
  `paymentName` varchar(60) NOT NULL COMMENT '支付方式名称',
  `consignee` varchar(60) NOT NULL COMMENT '收货人',
  `originRegionName` varchar(255) NOT NULL COMMENT '原淘宝收货地址信息',
  `originAddress` varchar(255) NOT NULL COMMENT '原淘宝收货人详细收货信息',
  `province` int(10) unsigned NOT NULL COMMENT '收货地址中国省份',
  `city` int(10) unsigned NOT NULL COMMENT '收货地址中的城市',
  `region` int(10) unsigned NOT NULL COMMENT '收货地址中城市中的区',
  `street` int(10) unsigned NOT NULL COMMENT '街道ID',
  `markBuilding` int(10) NOT NULL COMMENT '标志建筑物',
  `poiId` varchar(64) NOT NULL DEFAULT '' COMMENT '标建ID',
  `poiName` varchar(100) DEFAULT '' COMMENT '标建名称',
  `regionName` varchar(200) NOT NULL COMMENT '地区名称(如:北京 北京 昌平区 兴寿镇)',
  `address` varchar(255) NOT NULL COMMENT '收货地址中用户输入的地址,一般是区以下的详细地址',
  `zipcode` varchar(20) NOT NULL COMMENT '收货地址中的邮编',
  `mobile` varchar(15) NOT NULL COMMENT '收货人手机号',
  `phone` varchar(20) NOT NULL COMMENT '收货人固定电话号',
  `receiptInfo` text NOT NULL COMMENT '发票信息,序列化数组array(''title'' =>.., ''receiptType'' =>..,''needReceipt'' => ..,''companyName'' =>..,''taxSpotNum'' =>..,''regAddress''=>..,''regPhone''=>..,''bank''=>..,''bankAccount''=>..)',
  `delayShipTime` int(10) unsigned NOT NULL COMMENT '延迟发货日期',
  `remark` text NOT NULL COMMENT '订单备注',
  `bankCode` varchar(255) DEFAULT NULL COMMENT '银行代码,用于银行直链支付',
  `agent` varchar(255) DEFAULT NULL COMMENT '处理人',
  `confirmTime` int(11) DEFAULT NULL COMMENT '确认时间',
  `firstConfirmTime` int(10) unsigned NOT NULL COMMENT '首次确认时间',
  `firstConfirmPerson` varchar(200) NOT NULL COMMENT '第一次确认人',
  `finishTime` int(11) DEFAULT NULL COMMENT '订单完成时间',
  `tradeSn` varchar(255) DEFAULT NULL COMMENT '在线支付交易流水号',
  `signCode` varchar(20) NOT NULL COMMENT '收货确认码',
  `source` varchar(30) NOT NULL COMMENT '订单来源',
  `sourceOrderSn` varchar(60) NOT NULL COMMENT '外部订单号',
  `onedayLimit` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否支持24小时限时达',
  `logisticsManner` int(1) NOT NULL COMMENT '物流评价',
  `afterSaleManner` int(1) NOT NULL COMMENT '售后评价',
  `personManner` int(1) NOT NULL COMMENT '人员态度',
  `visitRemark` varchar(400) NOT NULL COMMENT '回访备注',
  `visitTime` int(11) NOT NULL COMMENT '回访时间',
  `visitPerson` varchar(20) NOT NULL COMMENT '回访人',
  `sellPeople` varchar(20) NOT NULL COMMENT '销售代表',
  `sellPeopleManner` int(1) NOT NULL COMMENT '销售代表服务态度',
  `orderType` tinyint(2) NOT NULL COMMENT '订单类型 默认0 团购预付款 团购正式单 2',
  `hasReadTaobaoOrderComment` tinyint(1) unsigned NOT NULL COMMENT '是否已读取过淘宝订单评论',
  `memberInvoiceId` int(10) unsigned NOT NULL COMMENT '订单发票ID,MemberInvoices表的主键',
  `taobaoGroupId` int(10) unsigned NOT NULL COMMENT '淘宝万人团活动ID',
  `tradeType` varchar(100) NOT NULL COMMENT '交易类型,值参考淘宝',
  `stepTradeStatus` varchar(100) NOT NULL COMMENT '分阶段付款的订单状态,值参考淘宝',
  `stepPaidFee` decimal(10,2) NOT NULL COMMENT '分阶段付款的已付金额',
  `depositAmount` decimal(10,2) unsigned NOT NULL COMMENT '定金应付金额',
  `balanceAmount` decimal(10,2) unsigned NOT NULL COMMENT '尾款应付金额',
  `autoCancelDays` int(10) unsigned NOT NULL COMMENT '未付款过期的天数',
  `isNoLimitStockOrder` tinyint(1) unsigned NOT NULL COMMENT '是否是无库存限制订单',
  `ccbOrderReceivedLogId` int(10) unsigned NOT NULL COMMENT '建行订单接收日志ID',
  `ip` varchar(50) NOT NULL COMMENT '订单来源IP,针对商城前台订单',
  `isGiftCardOrder` tinyint(1) unsigned NOT NULL COMMENT '是否为礼品卡订单',
  `giftCardDownloadPassword` varchar(200) NOT NULL COMMENT '礼品卡下载密码',
  `giftCardFindMobile` varchar(20) NOT NULL COMMENT '礼品卡密码找回手机号',
  `autoConfirmNum` int(10) unsigned NOT NULL COMMENT '已自动确认的次数',
  `codConfirmPerson` varchar(100) NOT NULL COMMENT '货到付款确认人',
  `codConfirmTime` int(11) NOT NULL COMMENT '货到付款确认时间',
  `codConfirmRemark` varchar(255) NOT NULL COMMENT '货到付款确认备注',
  `codConfirmState` tinyint(1) unsigned NOT NULL COMMENT '货到侍确认状态0无需未确认,1待确认,2确认通过可以发货,3确认无效,订单可以取消',
  `paymentNoticeUrl` text NOT NULL COMMENT '付款结果通知URL',
  `addressLon` decimal(9,6) NOT NULL COMMENT '地址经度',
  `addressLat` decimal(9,6) NOT NULL COMMENT '地址纬度',
  `smConfirmStatus` tinyint(4) NOT NULL COMMENT '标建确认状态。1 = 初始状态;2 = 已发HP,等待确认;3 = 待人工处理;4 = 待自动处理;5 = 已确认',
  `smConfirmTime` int(10) NOT NULL COMMENT '请求发送HP时间,格式为时间戳',
  `smManualTime` int(10) DEFAULT '0' COMMENT '转人工确认时间',
  `smManualRemark` varchar(200) DEFAULT '' COMMENT '转人工确认备注',
  `isTogether` tinyint(3) unsigned NOT NULL COMMENT '货票通行',
  `isNotConfirm` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是无需确认的订单',
  `tailPayTime` int(11) NOT NULL DEFAULT '0' COMMENT '尾款付款时间',
  `points` int(11) DEFAULT '0' COMMENT '网单使用积分',
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
  `channelId` tinyint(4) DEFAULT '0' COMMENT '区分EP和商城',
  `isProduceDaily` int(2) NOT NULL DEFAULT '0' COMMENT '是否日日单(1:是,0:否)',
  `couponCode` varchar(20) NOT NULL DEFAULT '' COMMENT '优惠码编码',
  `couponCodeValue` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠码优惠金额',
  `ckCode` varchar(200) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ux_Orders_ordersn` (`orderSn`),
  KEY `memberId` (`memberId`),
  KEY `agent` (`agent`),
  KEY `addTime` (`addTime`),
  KEY `payTime` (`payTime`),
  KEY `orderStatus` (`orderStatus`),
  KEY `sourceOrderSn` (`sourceOrderSn`),
  KEY `smConfirmStatus` (`smConfirmStatus`),
  KEY `idx_orders_source_orderStatus_hasReadTaobaoOrderComment` (`source`,`orderStatus`,`hasReadTaobaoOrderComment`),
  KEY `idx_order_mobile` (`mobile`),
  KEY `idx_orders_codConfirmState` (`codConfirmState`),
  KEY `modified` (`modified`),
  KEY `tailPayTime` (`tailPayTime`),
  KEY `ix_Orders_syncTime` (`syncTime`),
  KEY `ix_Orders_relationOrderSn` (`relationOrderSn`),
  KEY `ix_Orders_consignee` (`consignee`),
  KEY `idx_firstConfirmTime` (`firstConfirmTime`),
  KEY `ix_Orders_paymentStatus` (`paymentStatus`)
) ENGINE=InnoDB AUTO_INCREMENT=120128 DEFAULT CHARSET=utf8;

数据导入

        设置mysql 导入数据允许的最大包大小:

set global max_allowed_packet=1024*1024*32;

        导入数据

source /opt/tags_dat.sql;

        此表中目前的数据量为:125463条

mysql> SELECT COUNT(1) FROM tags_dat.tbl_goods ;
+----------+
| COUNT(1) |
+----------+
|   125463 |
+----------+

        此表中目前的数据量为:950条

mysql> SELECT COUNT(1) FROM tags_dat.tbl_users ;
+----------+
| COUNT(1) |
+----------+
|      950 |
+----------+

        此表中目前的数据量为:376983条

mysql> SELECT COUNT(1) FROM tags_dat.tbl_logs;
+----------+
| COUNT(1) |
+----------+
|   376983 |
+----------+

         此表中目前的数据量为:120125条

mysql> SELECT COUNT(1) FROM tags_dat.tbl_orders;
+----------+
| COUNT(1) |
+----------+
|   120125 |
+----------+

1.3、Hive 数据仓库

        将MySQL数据库中表的数据导入到Hive表中,以便加载到HBase表中。
大数据【企业级360°全方位用户画像】业务数据调研及ETL_第5张图片
        启动HiveMetastore服务和HiveServer2服务,使用beeline命令行连接,相关命令如下:

[root@bigdata-cdh01 ~]# /export/servers/hive/bin/beeline

Beeline version 1.1.0-cdh5.14.0 by Apache Hive
beeline> !connect jdbc:hive2://bd001:10000
scan complete in 2ms
Connecting to jdbc:hive2://bd001:10000
Enter username for jdbc:hive2://bd001:10000: root
Enter password for jdbc:hive2://bd001:10000: ****
Connected to: Apache Hive (version 1.1.0-cdh5.14.0)
Driver: Hive JDBC (version 1.1.0-cdh5.14.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://bd001:10000>
1.3.1、 创建表

        创建Hive中数据库Database:

CREATE DATABASE tags_dat;

        根据MySQL数据库表在Hive数据仓库中构建相应的表:

  • 行为日志表:tbl_logs
/export/servers/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://bd001:3306/tags_dat \
--table tbl_logs \
--username root \
--password 123456 \
--hive-table tags_dat2.tbl_logs \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
  • 商品表:tbl_goods
/export/servers/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://bd001:3306/tags_dat \
--table tbl_goods \
--username root \
--password 123456 \
--hive-table tags_dat2.tbl_goods \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
  • 订单数据表:tbl_orders
/export/servers/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://bd001:3306/tags_dat \
--table tbl_orders \
--username root \
--password 123456 \
--hive-table tags_dat2.tbl_orders \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
  • 用户信息表:tbl_users
/export/servers/sqoop/bin/sqoop create-hive-table \
--connect jdbc:mysql://bd001:3306/tags_dat \
--table tbl_users \
--username root \
--password 123456 \
--hive-table tags_dat2.tbl_users \
--fields-terminated-by '\t' \
--lines-terminated-by '\n'
1.3.2、导入数据至Hive表

        使用Sqoop将MySQL数据库表中的数据导入到Hive表中(本质就是存储在HDFS上),具体命令如下。

  • 行为日志表:tbl_logs
/export/servers/sqoop/bin/sqoop import \
--connect jdbc:mysql://bd001:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_logs \
--direct \
--hive-overwrite \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-table tags_dat2.tbl_logs \
--hive-import \
--num-mappers 20
  • 商品表:tbl_goods
/export/servers/sqoop/bin/sqoop import \
--connect jdbc:mysql://bd001:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_goods \
--direct \
--hive-overwrite \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-table tags_dat2.tbl_goods \
--hive-import \
--num-mappers 5
  • 订单数据表:tbl_orders
/export/servers/sqoop/bin/sqoop import \
--connect jdbc:mysql://bd001:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_orders \
--direct \
--hive-overwrite \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-table tags_dat2.tbl_orders \
--hive-import \
--num-mappers 10
  • 用户信息表:tbl_users
/export/servers/sqoop/bin/sqoop import \
--connect jdbc:mysql://bd001:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_users \
--direct \
--hive-overwrite \
--delete-target-dir \
--fields-terminated-by '\t' \
--lines-terminated-by '\n' \
--hive-table tags_dat2.tbl_users \
--hive-import \
--num-mappers 1

2、数据导入(Import)

        将MySQL表中业务数据导入大数据平台中如HBase表,方案如下所示:
大数据【企业级360°全方位用户画像】业务数据调研及ETL_第6张图片

2.1、HBase 表设计

        电商网站中各类数据(用户信息数据用户访问日志数据及用户订单数据)存储到HBase表中,便于检索和分析构建电商用户画像,有如下几张表:

hbase(main):008:0> list
TABLE
tbl_logs
tbl_orders
tbl_users
tbl_goods

=> ["tbl_logs", "tbl_orders", "tbl_users", "tbl_goods"]

2.2、Sqoop直接导入

        可以使用SQOOP将MySQL表的数据导入到HBase表中,指定表的名称、列簇及RowKey,范例如下所示:

/export/servers/sqoop/bin/sqoop import \
-D sqoop.hbase.add.row.key=true \
--connect jdbc:mysql://bd001:3306/tags_dat \
--username root \
--password 123456 \
--table tbl_users \
--hbase-create-table \
--hbase-table tbl_users2 \
--column-family detail \
--hbase-row-key id \
--num-mappers 2

        参数含义解释:

1-D sqoop.hbase.add.row.key=true 
	是否将rowkey相关字段写入列族中,默认为false,默认情况下你将在列族中看不到任何row key中的字段。注意,该参数必须放在import之后。

2--hbase-create-table  如果hbase中该表不存在则创建

3--hbase-table   对应的hbase表名

4--hbase-row-key   hbase表中的rowkey,注意格式

5--column-family   hbase表的列族

2.3、HBase ImportTSV

        ImportTSV功能描述:

将tsv(也可以是csv,每行数据中各个字段使用分隔符分割)格式文本数据,加载到HBase表中。
1)、采用Put方式加载导入
2)、采用BulkLoad方式批量加载导入

        分别演示采用直接Put方式和HFile文件方式将数据导入HBase表,命令如下:

  • 其一、直接导入Put方式
HADOOP_HOME=/export/servers/hadoop
HBASE_HOME=/export/servers/hbase
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf ${HADOOP_HOME}/bin/yarn jar ${HBASE_HOME}/lib/hbase-server-1.2.0-cdh5.14.0.jar \
importtsv \
-Dimporttsv.columns=HBASE_ROW_KEY,detail:log_id,detail:remote_ip,detail:site_global_ticket,detail:site_global_session,detail:global_user_id,detail:cookie_text,detail:user_agent,detail:ref_url,detail:loc_url,detail:log_time \
tbl_logs2 \
/user/hive/warehouse/tags_dat2.db/tbl_logs

        上述命令本质上运行一个MapReduce应用程序,将文本文件中每行数据转换封装到Put对象,然后插入到HBase表中

回顾一下:
	采用Put方式向HBase表中插入数据流程:
		Put
			-> WAL 预写日志
			-> MemStore(内存) ,当达到一定大写Spill到磁盘上:StoreFile(HFile)
	思考:
		对海量数据插入,能否将数据直接保存为HFile文件,然后加载到HBase表中
  • 其二、转换为HFile文件,再加载至表
# 1. 生成HFILES文件
HADOOP_HOME=/export/servers/hadoop
HBASE_HOME=/export/servers/hbase
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf ${HADOOP_HOME}/bin/yarn jar ${HBASE_HOME}/lib/hbase-server-1.2.0-cdh5.14.0.jar \
importtsv \
-Dimporttsv.bulk.output=hdfs://bd001:8020/datas/output_hfile/tbl_tag_logs \
-Dimporttsv.columns=HBASE_ROW_KEY,detail:log_id,detail:remote_ip,detail:site_global_ticket,detail:site_global_session,detail:global_user_id,detail:cookie_text,detail:user_agent,detail:ref_url,detail:loc_url,detail:log_time \
tbl_logs2 \
/user/hive/warehouse/tags_dat2.db/tbl_logs

# 2.HFILE文件加载到表中
HADOOP_CLASSPATH=`${HBASE_HOME}/bin/hbase mapredcp`:${HBASE_HOME}/conf ${HADOOP_HOME}/bin/yarn jar \
${HBASE_HOME}/lib/hbase-server-1.2.0-cdh5.14.0.jar \
completebulkload \
hdfs://bd001:8020/datas/output_hfile/tbl_tag_logs \
tbl_logs2

        但这种方法的缺点是:

1)、ROWKEY不能是组合主键
	只能是某一个字段
2)、当表中列很多时,书写-Dimporttsv.columns值时很麻烦,容易出错

2.4、HBase Bulkload

        在大量数据需要写入HBase时,通常有put方式和bulkLoad两种方式。

  • 1、put方式为单条插入,在put数据时会先将数据的更新操作信息和数据信息写入WAL,在写入到WAL后,数据就会被放到MemStore中,当MemStore满后数据就会被flush到磁盘(即形成HFile文件),在这种写操作过程会涉及到flush、split、compaction等操作,容易造成节点不稳定,数据导入慢,耗费资源等问题,在海量数据的导入过程极大的消耗了系统性能,避免这些问题最好的方法就是使用BulkLoad的方式来加载数据到HBase中。
val put = new Put(rowKeyByts)
put.addColumn(cf, column, value)
put.addColumn(cf, column, value)
put.addColumn(cf, column, value)
put.addColumn(cf, column, value)

table.put(put)

大数据【企业级360°全方位用户画像】业务数据调研及ETL_第7张图片

  • 2、BulkLoader利用HBase数据按照HFile格式存储在HDFS的原理,使用MapReduce直接批量生成HFile格式文件后,RegionServers再将HFile文件移动到相应的Region目录下。
    大数据【企业级360°全方位用户画像】业务数据调研及ETL_第8张图片
1)、Extract,异构数据源数据导入到 HDFS 之上。
2)、Transform,通过用户代码,可以是 MR 或者 Spark 任务将数据转化为 HFile。
3)、Load,HFile 通过 loadIncrementalHFiles 调用将 HFile 放置到 Region 对应的 HDFS 目录上,该过程可能涉及到文件切分。

1、不会触发WAL预写日志,当表还没有数据时进行数据导入不会产生Flush和Split。
2、减少接口调用的消耗,是一种快速写入的优化方式。

        关于如何使用Spark读写HBase之使用Spark自带的API以及使用Bulk Load将大量数据导入HBase,可以参考简书上的这篇文章:https://www.jianshu.com/p/b6c5a5ba30af


小结

        本篇博客主要为大家带来了业务数据的来源以及如何从MySQL同步到Hive,再从Hive导入到HBase的一个过程。其中数据导入到HBase一共有5种方法,本篇博客只给出了3种方法。想知道另外两种方法的朋友可以在评论区讨论,也可以来私信询问

        如果以上过程中出现了任何的纰漏错误,烦请大佬们指正

        受益的朋友或对大数据技术感兴趣的伙伴记得点赞关注支持一波

在这里插入图片描述

你可能感兴趣的:(大数据实战项目)