写在前面: 博主是一名软件工程系大数据应用开发专业大二的学生,昵称来源于《爱丽丝梦游仙境》中的Alice和自己的昵称。作为一名互联网小白,
写博客一方面是为了记录自己的学习历程,一方面是希望能够帮助到很多和自己一样处于起步阶段的萌新
。由于水平有限,博客中难免会有一些错误,有纰漏之处恳请各位大佬不吝赐教!个人小站:http://alices.ibilibili.xyz/ , 博客主页:https://alice.blog.csdn.net/
尽管当前水平可能不及各位大佬,但我还是希望自己能够做得更好,因为一天的生活就是一生的缩影
。我希望在最美的年华,做最好的自己
!
之前关于用户画像项目部分的讲解大多停留在理论层面,本篇我们正式开始对该项目中所使用到的业务数据进行调研和ETL处理。
整个用户画像(UserProfile)项目中,数据、业务及技术流程图如下所示:
其中数据源存储在业务系统数据库:MySQL 数据库中,采用SQOOP全量/增量将数据抽取到HDFS(Hive表中),通过转换为HFile文件加载到HBase表。
1)、为什么将订单相关数据【订单数据和订单商品数据】存储到HBase表中????
特点:数据量比较大
存储HBase:存储海量数据、查询检索
2)、实际项目来说【访问行为日志】数据存储到Hive表中
数据仓库分层:
ODS层、DW层和APP层
3)、特殊:模拟的所有业务数据存储在RDBMs表中,为了简化整个项目开发,重点在于标签开发,将所有数据迁移到HBase表中。
所有的业务数据,都是编写程序模拟产生的,直接保存到MySQL数据库的表中。
在数据库【tags_dat】中包含四张表:
1)、订单商品表:tbl_goods
2)、用户表:tbl_users
3)、行为日志表:tbl_logs
4)、订单数据表:tbl_orders
电商系统中四张表的结构如下,数据存储在MySQL数据库中(为了方便模拟业务数据,存储MySQL表)。
数据库 tags_dat,构建语句如下:
mysql> show create database tags_dat ;
+----------+----------------------------------------------------------+
| tags_dat | CREATE DATABASE `tags_dat` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+----------------------------------------------------------+
电商网站中订单商品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;
电商网站中用户基本信息表,总共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;
电商网站中用户浏览网站访问行为日志数据(浏览数据),总共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;
电商网站中用户购买物品下单的订单数据,总共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 |
+----------+
将MySQL数据库中表的数据导入到Hive表中,以便加载到HBase表中。
启动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>
创建Hive中数据库Database:
CREATE DATABASE tags_dat;
根据MySQL数据库表在Hive数据仓库中构建相应的表:
/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'
/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'
/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'
/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'
使用Sqoop将MySQL数据库表中的数据导入到Hive表中(本质就是存储在HDFS上),具体命令如下。
/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
/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
/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
/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
将MySQL表中业务数据导入大数据平台中如HBase表,方案如下所示:
电商网站中各类数据(用户信息数据、用户访问日志数据及用户订单数据)存储到HBase表中,便于检索和分析构建电商用户画像,有如下几张表:
hbase(main):008:0> list
TABLE
tbl_logs
tbl_orders
tbl_users
tbl_goods
=> ["tbl_logs", "tbl_orders", "tbl_users", "tbl_goods"]
可以使用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表的列族
ImportTSV功能描述:
将tsv(也可以是csv,每行数据中各个字段使用分隔符分割)格式文本数据,加载到HBase表中。
1)、采用Put方式加载导入
2)、采用BulkLoad方式批量加载导入
分别演示采用直接Put方式和HFile文件方式将数据导入HBase表,命令如下:
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表中
# 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值时很麻烦,容易出错
在大量数据需要写入HBase时,通常有put方式和bulkLoad两种方式。
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)
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种方法。想知道另外两种方法的朋友可以在评论区讨论,也可以来私信询问
如果以上过程中出现了任何的纰漏错误,烦请大佬们指正
受益的朋友或对大数据技术感兴趣的伙伴记得点赞关注支持一波