写在前面:博主是一名大数据的初学者,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,
写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新
。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:http://alices.ibilibili.xyz/ , 博客主页:https://alice./尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为
一天的生活就是一生的缩影
。我希望在最美的年华,做最好的自己
!
之前关于用户画像项目部分的讲解大多停留在理论层面,本篇我们正式开始对该项目中所使用到的业务数据进行调研和ETL处理。
文章目录
业务数据调研及ETL1、电商数据(数据源)1.1、MySQL数据库1.2、表的结构1.2.1、数据库Database1.2.2、订单商品信息表:tbl_goods1.2.3、会员信息表:tbl_users1.2.4、行为日志表:tbl_logs1.2.5、订单数据表:tbl_orders1.3、Hive 数据仓库1.3.1、 创建表1.3.2、导入数据至Hive表2、数据导入(Import)2.1、HBase 表设计2.2、Sqoop直接导入2.3、HBase ImportTSV2.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_goods2)、用户表:tbl_users3)、行为日志表:tbl_logs4)、订单数据表: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=18 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 |+----------+
此表中目前的数据量为:15条
mysql> SELECT COUNT(1) FROM tags_dat.tbl_orders;+----------+| COUNT(1) |+----------+| 15 |+----------+
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 Hivebeeline> !connect jdbc:hive2://bd001:10000scan complete in 2msConnecting to jdbc:hive2://bd001:10000Enter username for jdbc:hive2://bd001:10000: rootEnter 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_READ0: 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> listTABLEtbl_logstbl_orderstbl_userstbl_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/hadoopHBASE_HOME=/export/servers/hbaseHADOOP_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/hadoopHBASE_HOME=/export/servers/hbaseHADOOP_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,可以参考简书上的这篇文章:/p/b6c5a5ba30af
小结
本篇博客主要为大家带来了业务数据的来源以及如何从MySQL同步到Hive,再从Hive导入到HBase的一个过程。其中数据导入到HBase一共有5种方法,本篇博客只给出了3种方法。想知道另外两种方法的朋友可以在评论区讨论,也可以来私信询问😉
如果以上过程中出现了任何的纰漏错误,烦请大佬们指正😅
受益的朋友或对大数据技术感兴趣的伙伴记得点赞关注支持一波🙏