目录
工业场景下 Hive 表通常使用 uid 作为用户维度构建和更新 Hive 表,当我们需要查询指定批次用户信息时,可以使用 in 限定范围,下面实践不同 uid 数量下 Select 的示例。
使用 'IN' 可以指定一个范围,让查询返回指定列表中所对应的元素,假设我们有一个 user 表,里面有一列 uid,我们需要查询多个 uid 的信息,可以使用下述语句查询:
hive -e "
SELECT * FROM users WHERE uid IN (uid1, uid2, uid3, ..., uidN);
"
查询后会将列表中所有 uid 符合的 row 都拿到。
上面的方法很简洁,我们只需要将 uid 逗号分割放到脚本即可,但是还有一种复杂的情况,就是我们的 uid 非常多,例如上万个用户信息,这时候如果还使用上面 in (uid1, uid2 ...) 的形式脚本的可读性会很差,而且不易维护,所以我们通过建表的形式存储多个 uid,通过 in 与新表交互,实现优雅的查询代码。
hive -e "create Table tmp_uid_list (uid INT);"
hive -e "LOAD DATA LOCAL INPATH '$local_path' INTO TABLE tmp_uid_list"
hive -e "LOAD DATA INPATH '$hdfs_path' INTO TABLE tmp_uid_list;
hive -e "
select * from users
where dt between '20231225' and '20231231'
and uid in (select uid from tmp_uid_list);
"
通过建表我们将大量 uid 存储至 Hive 的 tmp 临时表中,如果 uid 数量不多可以放置在本地,如果 uid 数量很大可以放置在 HDFS 文件系统,随后 LOAD 进 Hive 表再配合 Select 操作即可。
这里博主是 7.2 w 个 uid,所以直接放在本地 File Local Load 了,只用 3 行 SQL 就能解决,如果换成手写 7w 个 Uid,脑壳疼。