大數據【企業級360°全方位用戶畫像】業務數據調研及ETL

寫在前面: 博主是一名軟件工程系大數據應用開發專業大二的學生,暱稱來源於《愛麗絲夢遊仙境》中的Alice和自己的暱稱。作爲一名互聯網小白,寫博客一方面是爲了記錄自己的學習歷程,一方面是希望能夠幫助到很多和自己一樣處於起步階段的萌新。由於水平有限,博客中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!個人小站:http://alices.ibilibili.xyz/ , 博客主頁:https://alice.blog.csdn.net/
儘管當前水平可能不及各位大佬,但我還是希望自己能夠做得更好,因爲一天的生活就是一生的縮影。我希望在最美的年華,做最好的自己

        之前關於用戶畫像項目部分的講解大多停留在理論層面,本篇我們正式開始對該項目中所使用到的業務數據進行調研和ETL處理
在這裏插入圖片描述


業務數據調研及ETL

        整個用戶畫像(UserProfile)項目中,數據、業務及技術流程圖如下所示:

在這裏插入圖片描述
        其中數據源存儲在業務系統數據庫:MySQL 數據庫中,採用SQOOP全量/增量將數據抽取到HDFS(Hive表中),通過轉換爲HFile文件加載到HBase表。

在這裏插入圖片描述
思考?

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

在這裏插入圖片描述

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/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表,方案如下所示:
在這裏插入圖片描述

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種方法。想知道另外兩種方法的朋友可以在評論區討論,也可以來私信詢問😉

        如果以上過程中出現了任何的紕漏錯誤,煩請大佬們指正😅

        受益的朋友或對大數據技術感興趣的夥伴記得點贊關注支持一波🙏

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章