需求分析:按地區(用戶性別、用戶年齡段)統計當日新增付費用戶首單平均消費
- 每筆訂單都要判斷是否是該用戶的首單。
- 無論是地區名稱、用戶性別、用戶年齡,訂單表中都沒有這些字段。但是可以通過外鍵的形式關聯其他表得到這些值。
處理判斷首單業務的策略
判斷是否首單的要點,在於該用戶之前是否參與過消費(下單)。那麼如何知道用戶之前是否參與過消費,如果臨時從所有消費記錄中查詢,是非常不現實的。那麼只有將“用戶是否消費過”這個狀態進行保存並長期維護起來。在有需要的時候通過用戶id進行關聯查詢。
在實際生產中,這種用戶狀態是非常常見的比如“用戶是否退過單”、“用戶是否投過訴”、“用戶是否是高淨值用戶”等等。
那麼現在問題就變爲,如何保存並長期維護這種狀態。考慮到
1、 這是一個保存週期較長的數據。
2、 必須可修改狀態值。
3、 查詢模式基本上是k-v模式的查詢。
所以綜上這三點比較適合保存在Hbase中。
數據流程圖
HBase回顧配置
- hbase-env.sh修改內容
export JAVA_HOME=/opt/module/jdk1.6.0_144
export HBASE_MANAGES_ZK=false
- hbase-site.xml修改內容
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop102:9000/HBase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 0.98後的新變動,之前版本沒有.port,默認端口爲60000 -->
<property>
<name>hbase.master.port</name>
<value>16000</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop102,hadoop103,hadoop104</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/opt/module/zookeeper-3.4.10/zkData</value>
</property>
</configuration>
- regionservers
hadoop102
hadoop103
hadoop104
- 軟連接hadoop配置文件到HBase
[atguigu@hadoop102 module]$ ln -s /opt/module/hadoop-2.7.2/etc/hadoop/core-site.xml /opt/module/hbase/conf/core-site.xml
[atguigu@hadoop102 module]$ ln -s /opt/module/hadoop-2.7.2/etc/hadoop/hdfs-site.xml /opt/module/hbase/conf/hdfs-site.xml
- 分發
- 啓動方式
bin/hbase-daemon.sh start master
bin/hbase-daemon.sh start regionserver
bin/start-hbase.sh
bin/stop-hbase.sh
- 端口號
http://hadoop102:16010
- shell
bin/hbase shell
help
list
Phoenix部署
- 複製jar包
// 三臺節點得Hbase中都要有
cp phoenix-4.14.2-HBase-1.3-server.jar /opt/module/hbase-1.3.1/lib/
cp phoenix-4.14.2-HBase-1.3-client.jar /opt/module/hbase-1.3.1/lib/
- 配置環境
#phoenix
export PHOENIX_HOME=/opt/module/phoenix
export PHOENIX_CLASSPATH=$PHOENIX_HOME
export PATH=$PATH:$PHOENIX_HOME/bin
- 啓動
/opt/module/phoenix/bin/sqlline.py hadoop102,hadoop103,hadoop104:2181
- shell操作
// 顯示所有表
!table 或 !tables
退出
!quit
啓動進程
使用工具
添加Driver
添加連接
連接
創建表
create table user_state( user_id varchar primary key ,state.if_consumed varchar ) SALT_BUCKETS = 3