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

之前关于用户画像项目部分的讲解大多停留在理论层面,本篇我们正式开始对该项目中所使用到的业务数据进行调研和ETL处理

文章目录

  • 业务数据调研及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)项目中,数据、业务及技术流程图如下所示:


        其中数据源存储在业务系统数据库:MySQL 数据库中,采用SQOOP全量/增量将数据抽取到HDFS(Hive表中),通过转换为HFile文件加载到HBase表。


思考?

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

1、电商数据(数据源)

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

1.1、MySQL数据库

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

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

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表中。

        启动HiveMetastore服务和HiveServer2服务,使用beeline命令行连接,相关命令如下:

[root@bigdata-cdh01 ~]# /export/servers/hive/bin/beelineBeeline 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表,方案如下所示:

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)

  • 2、BulkLoader利用HBase数据按照HFile格式存储在HDFS的原理,使用MapReduce直接批量生成HFile格式文件后,RegionServers再将HFile文件移动到相应的Region目录下。
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种方法。想知道另外两种方法的朋友可以在评论区讨论,也可以来私信询问

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

  1. 企业级360°全方位用户画像:环境搭建[五]

    絮叨两句: 博主是一名软件工程系的在校生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们 人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战 少年 ...

  2. 大数据【企业级360°全方位用户画像】之USG模型和决策树分类算法

    在之前的一篇博客<大数据[企业级360°全方位用户画像]之RFM模型和KMeans聚类算法>中,博主为大家带来了KMeans聚类算法的介绍.并在之后,基于不同的模型开发标签,例如RFM,R ...

  3. 企业级360°全方位用户画像:项目介绍[二]

    絮叨两句: 博主是一名软件工程系的在校生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们 人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战 少年 ...

  4. 企业级360°全方位用户画像:标签系统[四]

    絮叨两句: 博主是一名软件工程系的在校生,利用博客记录自己所学的知识,也希望能帮助到正在学习的同学们 人的一生中会遇到各种各样的困难和折磨,逃避是解决不了问题的,唯有以乐观的精神去迎接生活的挑战 少年 ...

  5. 企业级360°全方位用户画像

    用户画像概念.项目概述及环境搭建 1.用户画像 1.1.概念 什么是用户画像? 百度百科定义 用户画像又称用户角色,作为一种勾画目标用户.联系用户诉求与设计方向的有效工具,用户画像在各领域得到了广泛的 ...

  6. Profile_Day05:企业级360全方位用户画像

    Profile_Day05:企业级360全方位用户画像 1昨日内容回顾 主要讲解2个方面的内容: 如何基于SparkSQL实现自定义外部数据源HBase和统计类型标签模型开发. 1, SparkSQL ...

  7. 大数据【企业级360°全方位用户画像】匹配型标签开发

    写在前面: 博主是一名大数据的初学者,昵称来源于<爱丽丝梦游仙境>中的Alice和自己的昵称.作为一名互联网小白,写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样 ...

  8. 大数据【企业级360°全方位用户画像】标签系统介绍

    在前面几篇博客中,博主已经为大家带来了什么是用户画像,以及项目的一个基础介绍.用户画像的核心就是打标签,本篇博客,我们来聊聊关于这个项目的标签系统. 文章目录 1. 标签系统 1.1 基础标签 1.1 ...

  9. 大数据【企业级360°全方位用户画像】项目介绍

    在正式开始对[企业级用户画像]项目展开介绍之前,博主可是煞费苦心,为大家整理了一期,如何彻底理解什么是用户画像(

最新文章

  1. utf8汉字编码16进制对照(转载)
  2. Psychz租用Switch公司两个数据中心的空间
  3. tar解压出错:gzip: stdin: unexpected end of file的解决
  4. http --- 共享加密(对称加密)的几个概念
  5. 北斗有 35 颗卫星,而 GPS 有 24 颗卫星,为什么二者数量不同?
  6. vue监听用户在页面的浏览时间需在beforeDestroy()里面进行销毁
  7. linux网络客户端命令
  8. 电风扇标准集合(BS/EN/IEC/UL) - 安规+性能
  9. jdk16新特性_jdk8到jdk16新特性
  10. C++ gbk与utf8互转
  11. python实现证件照换底色
  12. python计算相关性显著性p值_基于python如何实现计算两组数据P值
  13. 使用SVG.Net生成svg格式文字图片
  14. git 查看自己秘钥_git秘钥配置--转
  15. 计算机网络总复习(一)——选择篇
  16. 微信小程序导入csv文件乱码问题
  17. 大专生学Java找得到工作吗_工资如何?
  18. universal bios_技嘉开始为400系主板提供BIOS更新
  19. vue.js搭建个人博客
  20. 如何在 Vivaldi 浏览器中设置 百度 搜索

热门文章

  1. IS61LV25616芯片技术手册
  2. 文字翻译软件-文字批量翻译转换器免费
  3. eclipse取消默认工作空间的两种方法
  4. Connection Timeout 问题排查
  5. 诺贝尔奖获得者平均年龄是多少?属于我们的时间好像不多了
  6. 环境配置6-Win10下安装CUDA和cuDNN,配置caffe
  7. Week12—最大匹配括号数
  8. FX3U控制松下服务器位置不准,三菱FX3UPLC如何控制松下伺服_.docx
  9. xpath解析爬虫爬取豆瓣图书Top250的数据
  10. Window应急响应(六):NesMiner挖矿病毒