48.判断是否为首单用户实现

4.1 准备工作
4.1.1 使用 phoenix 在 hbase 中建表
(1)解压 squirrel-sql-3.9.1.zip

 (2)在解压后的目录双击运行 squirrel-sql.bat

 (3)添加 phoenix 驱动

 

(4)具体驱动配置如下
Example URL
jdbc:phoenix:hadoop202,hadoop203,hadoop204:2181
Class Name
org.apache.phoenix.jdbc.PhoenixDriver

 (5)创建连接

提前启动好 hdfs 以及 hbase

 (6)连接后,查看数据库对象

 (7)执行 SQL 语句

 (8)调整字体大小

 (9)执行建表以语句

create table user_status2020( user_id varchar primary key ,state.if_consumed
varchar ) SALT_BUCKETS = 3

 4.1.2 在 pom.xml 文件中加入相关依赖

 4.1.3 创建样例类

(1)创建 OrderInfo 样例类

 

 (2)创建 UserStatus 样例类

 4.1.4 创建 phoenix 查询工具类 PhoenixUtil

 

 

4.2 读取订单信息,查询用户状态(判断是否首单)
4.2.1 创建业务类 OrderInfoApp,读取订单、维护用户状
态代码

 

 

 

4.2.2 测试
启动 ZK、Kafka、Redis、Maxwell、HDFS、Hbase
运行 BaseDBMaxwellApp、OrderInfoApp
修改模拟生成数据日期、运行模拟生成日志的 jar 包
OrderInfoApp 输出结果

 

4.3
维护用户状态
将用户是否消费的状态保存到 Hbase 中
4.3.1 在 OrderInfoApp 中继续完成代码

 

 

4.3.2 测试
启动 ZK、Kafka、Redis、Maxwell、HDFS、Hbase
运行 BaseDBMaxwellApp、OrderInfoApp
修改模拟生成数据日期、运行模拟生成日志的 jar 包
Hbase 输出结果

 

4.4
一个采集周期状态修正
漏洞
如果一个用户是首次消费,在一个采集周期中,这个用户下单了 2 次,那么就会
把这同一个用户都会统计为首单消费
解决办法
应该将同一采集周期的同一用户的最早的订单标记为首单,其它都改为非首单
同一采集周期的同一用户-----按用户分组(groupByKey)
最早的订单-----排序,取最早(sortwith)
标记为首单-----具体业务代码
代码

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,这里给您提供一个简单的Java代码实现用户列表根据汉字字母分组的示例。假设我们已经有一个User类,其中有一个name属性表示用户姓名: ```java import java.util.*; public class UserGrouping { public static void main(String[] args) { List<User> userList = new ArrayList<>(); // 假设这里已经获取到了用户列表数据并存储在userList中 // 将用户列表按照拼音字母进行排序 Collections.sort(userList, new Comparator<User>() { @Override public int compare(User u1, User u2) { String pinyin1 = PinyinUtils.getPinyin(u1.getName()); String pinyin2 = PinyinUtils.getPinyin(u2.getName()); return pinyin1.compareTo(pinyin2); } }); // 使用Map来存储分组后的用户列表,key为首字母,value为对应的用户列表 Map<String, List<User>> userMap = new LinkedHashMap<>(); for (User user : userList) { String firstLetter = PinyinUtils.getFirstLetter(user.getName()); if (!userMap.containsKey(firstLetter)) { userMap.put(firstLetter, new ArrayList<>()); } userMap.get(firstLetter).add(user); } // 输出分组后的用户列表 for (String letter : userMap.keySet()) { System.out.println("以" + letter + "开头的用户有:"); for (User user : userMap.get(letter)) { System.out.println(user.getName()); } System.out.println(); } } } class User { private String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } class PinyinUtils { // 这里需要用到汉字转拼音的工具类,这里不做详细展示 // 可以使用开源的pinyin4j库,或者第三方API服务,比如百度的汉字转拼音API public static String getPinyin(String hanzi) { // 省略实现 } public static String getFirstLetter(String hanzi) { // 省略实现 } } ``` 这段代码中,我们先使用Collections.sort方法将用户列表按照拼音字母进行排序。然后,我们使用LinkedHashMap来存储分组后的用户列表,遍历排序后的用户列表,根据每个用户的姓名字母,将其添加到对应的Map项中。最后,我们遍历Map,输出分组后的用户列表。 需要注意的是,这里的PinyinUtils.getPinyin和PinyinUtils.getFirstLetter方法是需要自己实现的,可以使用开源的pinyin4j库,或者第三方API服务,比如百度的汉字转拼音API。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据开发工程师-宋权

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值