hive 计算日新、日活、更新历史表、用户留存

2023-11-14

创建日活记录表

linux> vi user_dau.txt
1,zhansan,2023-02-10
2,lisi,2023-02-10
3,wangwu,2023-02-10
4,xiaohong,2023-02-10
5,aaa,2023-02-10
6,bbb,2023-02-10
7,ccc,2023-02-10
8,ddd,2023-02-10
9,eee,2023-02-10


hive>create table user_dau(
user_id string,
name    string,
datestr string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

hive>load data local inpath '/root/tmp_data/user_dau.txt' into table user_dau;

创建历史记录表

linux>5,aaa,2023-01-26,2023-02-01
6,bbb,2023-01-27,2023-02-02
7,ccc,2023-01-27,2023-02-04
8,ddd,2023-02-07,2023-02-09
9,eee,2023-02-06,2023-02-09
10,lisi,2023-02-02,2023-02-08
11,zhangsan,2023-02-02,2023-02-09
12,wangwu,2023-02-04,2023-02-09
13,fff,2023-02-05,2023-02-09
14,cs,2023-02-03,2023-02-09

hive>create table user_hsu(
user_id   string,
name      string,
first_dt  string,
last_dt   string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

hive>load data local inpath '/root/tmp_data/user_hus.txt' into table user_hsu;

查看当日日活表,创建计算日活表

hive>select * from user_demo;

#创建日活表

hive>create table user_dau_rec(
user_id string,
name string
)
partitioned by (dt string)
stored as orc;

计算日活

hive>insert into user_dau_rec partition (dt='2023-02-10')
select 
user_id,name
from user_dau
group by user_id,name;

#如果user_dau表有分区

hive>insert into user_dau_rec partition (dt='2023-02-10')
select 
user_id,name
from user_dau where dt='2023-02-10'
group by user_id,name;

#计算
hive>select count(user_id) from user_dau_rec where dt='2023-02-10';

计算日新  当日表和历史表left join 筛出历史表是空的数据得出日新

hive>select 
d.user_id,
d.name,
d.datestr
from user_dau  d
left join user_hsu  h
on (d.user_id=h.user_id)
where h.user_id is null;

查看当日与历史表对比

hive>select 
dau.*,
hsu.*
from user_dau dau full join user_hsu hsu 
on dau.user_id = hsu.user_id;
+--------------+-----------+--------------+--------------+-----------+---------------+--------------+--+
| dau.user_id  | dau.name  | dau.datestr  | hsu.user_id  | hsu.name  | hsu.first_dt  | hsu.last_dt  |
+--------------+-----------+--------------+--------------+-----------+---------------+--------------+--+
| 1            | zhansan   | 2023-02-10   | NULL         | NULL      | NULL          | NULL         |
| NULL         | NULL      | NULL         | 10           | lisi      | 2023-02-02    | 2023-02-08   |
| NULL         | NULL      | NULL         | 11           | zhangsan  | 2023-02-02    | 2023-02-09   |
| NULL         | NULL      | NULL         | 12           | wangwu    | 2023-02-04    | 2023-02-09   |
| NULL         | NULL      | NULL         | 13           | fff       | 2023-02-05    | 2023-02-09   |
| NULL         | NULL      | NULL         | 14           | cs        | 2023-02-03    | 2023-02-09   |
| 2            | lisi      | 2023-02-10   | NULL         | NULL      | NULL          | NULL         |
| 3            | wangwu    | 2023-02-10   | NULL         | NULL      | NULL          | NULL         |
| 4            | xiaohong  | 2023-02-10   | NULL         | NULL      | NULL          | NULL         |
| 5            | aaa       | 2023-02-10   | 5            | aaa       | 2023-01-26    | 2023-02-01   |
| 6            | bbb       | 2023-02-10   | 6            | bbb       | 2023-01-27    | 2023-02-02   |
| 7            | ccc       | 2023-02-10   | 7            | ccc       | 2023-01-27    | 2023-02-04   |
| 8            | ddd       | 2023-02-10   | 8            | ddd       | 2023-02-07    | 2023-02-09   |
| 9            | eee       | 2023-02-10   | 9            | eee       | 2023-02-06    | 2023-02-09   |
+--------------+-----------+--------------+--------------+-----------+---------------+--------------+--+
14 rows selected (17.506 seconds)

计算10号数据合并更新历史登录记录表    

hive>select
if(h.user_id is not null,h.user_id,d.user_id) as user_id,
if(h.user_id is not null,h.name,d.name) as name,
if(h.user_id is not null,h.first_dt,d.datestr) as first_dt,
if(d.user_id is not null,d.datestr,h.last_dt) as last_dt
from  user_dau d
full join user_hsu h
on (d.user_id=h.user_id);

历史表不为空则值是h.USER_ID 否则是 d.USER_ID
如果要更新历史表在select前面加 insert into 表名 partition (dt='日期') 即可

计算用户留存(历史表计算(不含新增的2.10日))

hive>select
first_dt as dt,
datediff('2023-02-09',first_dt) as days,
count(if(last_dt=='2023-02-09',1,null)) as  retail_counts
from user_hsu
group by  first_dt;
+-------------+-------+----------------+--+
|     dt      | days  | retail_counts  |
+-------------+-------+----------------+--+
| 2023-01-26  | 14    | 0              |
| 2023-01-27  | 13    | 0              |
| 2023-02-02  | 7     | 1              |
| 2023-02-03  | 6     | 1              |
| 2023-02-04  | 5     | 1              |
| 2023-02-05  | 4     | 1              |
| 2023-02-06  | 3     | 1              |
| 2023-02-07  | 2     | 1              |
+-------------+-------+----------------+--+
8 rows selected (18.066 seconds)

没有增加条件,最多计算一个月的留存

hive>select
first_dt as dt,
count(1) as dau_counts,
datediff('2023-02-09',first_dt) as days,
count(if(last_dt='2023-02-09',1,null)) as retail_counts
from user_hsu
group by first_dt;
+-------------+-------------+-------+----------------+--+
|     dt      | dau_counts  | days  | retail_counts  |
+-------------+-------------+-------+----------------+--+
| 2023-01-26  | 1           | 14    | 0              |
| 2023-01-27  | 2           | 13    | 0              |
| 2023-02-02  | 2           | 7     | 1              |
| 2023-02-03  | 1           | 6     | 1              |
| 2023-02-04  | 1           | 5     | 1              |
| 2023-02-05  | 1           | 4     | 1              |
| 2023-02-06  | 1           | 3     | 1              |
| 2023-02-07  | 1           | 2     | 1              |
+-------------+-------------+-------+----------------+--+
结果表述 最开始的数据 1.26日共1条,到2.9日依旧存留的共14天,共0人存留
表述 最开始的数据 2.7日共1条,到2.9日依旧存留的共2天,共1人存留

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

hive 计算日新、日活、更新历史表、用户留存 的相关文章

  • 使用 Hiveql 循环

    我正在尝试合并 2 个数据集 例如 A 和 B 数据集 A 有一个变量 Flag 它有 2 个值 我并没有只是将两个数据合并在一起 而是尝试根据 标志 变量合并两个数据集 合并代码如下 create table new data as se
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • 交换 ms-sql 表

    我想以尽可能最好的方式交换到桌子 我有一个 IpToCountry 表 并根据导入的外部 CSV 文件每周创建一个新表 我发现进行切换的最快方法是执行以下操作 sp rename IpToCountry IpToCountryOld go
  • SELECT DISTINCT HAVING 计算唯一条件

    我已经搜索过这个问题的答案 但找不到如何根据条件获取这个不同的记录集 我有一个包含以下示例数据的表 Type Color Location Supplier Apple Green New York ABC Apple Green New
  • SQLite 自然连接损坏?

    我刚刚开始了解 NATURAL JOIN 而 SQLite 的行为并不像我预期的那样 SELECT FROM r1 NATURAL JOIN r2 NATURAL JOIN r3 and SELECT FROM r1 NATURAL JOI
  • 日志中每天的每周活跃用户数

    我想知道是否有人可以帮助我使用一些 SQL 来返回两天或更长时间内登录到数据库表的唯一用户数量 让我们使用 7 天作为参考 我的日志表在每一行中包含时间戳 ts 和 user id 表示该用户当时的活动 以下查询返回此日志中的每日活跃用户数
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • VS 13/VS 15 - 无法导入 SQL 片段

    我想在中创建 SQL 片段VS2013 and VS2015 我不知道为什么 但我在导入时遇到错误 在两个 VS 中 C sql snippet Missing or unspecified Language attribute 我的片段
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • 通过Java从MySQL中获取大量记录

    有一个 MySQL 表 服务器上的用户 它有 28 行和 100 万条记录 也可能会增加 我想从这个表中获取所有行 对它们进行一些操作 然后将它们添加到 MongoDB 中 我知道通过简单的 从用户中选择 操作来检索这些记录将花费大量时间
  • 从 json 数组获取值并执行 sql 插入

    这是我的数组 json 1 Device ID a9a3346be4375a92 Date 2012 05 31 Time 15 22 59 Latitude 51 4972912 Longitude 0 1108178 2 Device
  • SQL Server中的列级与表级约束?

    A 列级 GO CREATE TABLE Products ProductID INT CONSTRAINT pk products pid PRIMARY KEY ProductName VARCHAR 25 GO b 表层 CREATE
  • sql server 2008 对 exec 语句的限制

    我只需要仔细检查 t sql 中的 EXEC 命令是否有字符限制 如果我有一个带有 varchar max 的变量并使用 EXEC 执行命令 你认为这样可以吗 thanks 应该没问题 根据这篇 MSDN 文章 http msdn micr
  • Postgres LIMIT/OFFSET 奇怪的行为

    我正在使用 PostgreSQL 9 6 我有一个这样的查询 SELECT anon 1 id AS anon 1 id anon 1 is valid AS anon 1 is valid anon 1 first name AS ano
  • 使用转义换行符和回车符取消转义字符串

    我正在尝试编写一个 PLPGSQL 函数来混淆 审查 编辑文本 Obfuscate a body of text by replacing lowercase letters and numbers with symbols CREATE
  • 如何在蜂巢中的每个组中按计数 desc 进行排序?

    这是 HQL select A B count as cnt from test table group by A B order by cnt desc 示例输出如下 a1 b1 5 a2 b1 3 a1 b2 2 a2 b2 1 但我想
  • Magento 设置脚本中的 ALTER TABLE 不使用 SQL

    乔纳森 戴 https stackoverflow com users 336905 jonathan day says 更新不应采用以下形式 SQL命令 我没遇到过 任何 DDL 或 DML 语句不能 通过 Magento 的配置执行 结
  • REGEXP_REPLACE - 仅当包含在 () 中时才从字符串中删除逗号

    我在 oracle 论坛网站找到了一个例子 输入字符串 a b c x y z a xx yy zz x WITH t AS SELECT a b c x y z a xx yy zz x col1 FROM dual SELECT t c
  • 如何使用第二行中的值填充第一行中的空值?

    我正在尝试编写一个查询 仅显示每个名称的第一行 但这些行的标题为空 因此我想从紧邻的下一行中提取它们的标题 table1 Name Title Row Dan NULL 1 Dan Engineer 2 Dan Developer 3 Ja
  • 最近邻居的 Postgis SQL

    我正在尝试计算最近的邻居 为此 我需要传递一个参数来限制与邻居的最大距离 例如 半径1000米内最近的邻居是哪些 我做了以下事情 我用数据创建了表 id name latitude longitude 之后 我执行了以下查询 SELECT

随机推荐

  • vLLM 实战

    引言 随着人工智能技术的飞速发展 以及今年以来 ChatGPT 的爆火 大语言模型 Large Language Model LLM 受到越来越多的关注 为了实现 LLM 部署时的推理优化 全球各地有众多团队做出了各种优化框架 本文以加州大
  • 视频压缩:I帧、P帧、B帧

    说明 1 本文通过整理而来 集多个高手的精华 此为最重点 2 因为在海思平台做多媒体视频处理 所以了解I帧 P帧 B帧等压缩 编解码特点是必须的 3 海思I帧间隔即GOP取值范围 0 1000 以帧为单位 为动态属性 4 欢迎拍砖
  • 2020-3-29 深度学习笔记16 - 结构化概率模型 1 (非结构化建模的挑战-内存要求大/统计销量低/运行时间长)

    第十六章 深度学习中的结构化概率模型 中文 英文 深度学习为研究者们提供了许多建模方式 用以设计以及描述算法 其中一种形式是结构化概率模型的思想 结构化概率模型是许多深度学习重要研究方向的关键组成部分 结构化概率模型使用图来描述概率分布中随
  • UniAPP布局

    uniapp建议使用flex布局 首先定义flex容器 display flex flex容器按主轴排列填充 支持横向 纵向排列 flex属性如下 flex direction排列方向 flex direction row flex wra
  • 上传已有项目到Gitee

    1 创建好gitee仓库 正常新建即可 默认已经创建好了 2 在本地项目目录下 右键 点击git bash here 3 在窗口输入命令 git init 这时候文件夹会多出一个 git文件夹 4 在码云复制仓库地址 然后 在窗口输入命令
  • LeetCode——019

    19 Remove Nth Node From End of List My Submissions QuestionEditorial Solution Total Accepted 104327 Total Submissions 35
  • qt 将图片转为base64字符串html直接可用

    Base64是基于64个可打印字符来显示2进制数据 它用于传输8Bit字节代码 并在HTTP传输中广泛应用 原理 把一连串的二进制数 拆为6个6个的二进制组 然后每个组头部补2个0 从而将数的范围限制在64以内 都是可视化字符了 解码是逆向
  • 抑止TDD noise

    抑止TDD noise 的措施 TDD noise Time Division Distortion 所造成的原因为手机射频发射模块端的功率放大器 Power Amplify 每1 216 8秒会有一个发射讯号产生 在该讯号中包含900MH
  • android opencv卡顿,Opencv读取摄像头卡顿

    Opencv读取摄像头卡顿 开发环境 Win10系统 罗技HD1080p高清摄像头 UE4 21 VS2017后端 开发原理 多线程中经过OpenCV对摄像头进行高清采集 1920 1080 而后显示到UMG中 多线程 遇到问题 在2k采集
  • Zipkin进行链路跟踪

    Zipkin 简介 Zipkin 是 Twitter 开源的分布式跟踪系统 基于 Dapper 的论文设计而来 它的主要功能是收集系统的时序数据 从而追踪微服务架构的系统延时等问题 Zipkin 还提供了一个非常友好的界面 便于我们分析追踪
  • 黑马Java品优购分布式电商项目全套视频及源码

    百度网盘链接 链接 https pan baidu com share init surl ItIpkDQ0Dwragb47HcLXKg 提取码 k5we 黑马微服务项目乐优商城全套 https blog csdn net m0 37768
  • Java生成二维码的几种实现方式(基于Spring Boot)

    本文将基于Spring Boot介绍两种生成二维码的实现方式 一种是基于Google开发工具包 另一种是基于Hutool来实现 为了方便理解二维码的实际应用场景 举一些例子 1 进销存系统 想必大家都听说过 其系统中的商品二维码承载了许多重
  • android 镜像文件img 介绍

    Android 源码 编译后 在 out target product generic下生成的三个镜像文件 ramdisk img 根文件系统 system img 包括了主要的包 库等文件 userdata img 包括了一些用户数据 以
  • 使用alist连接百度网盘和阿里云盘挂载到本地磁盘

    1 下载alist软件 alist软件下载地址 https github com alist org alist 跳转后 找到对应的windows版本 2 下载后解压 并启动服务 注意 alist的启动方式不是传统的双击启动 需要用命令提示
  • ios跨线程通知_一种基于Metal、Vulkan多线程渲染能力的渲染架构

    快手Y tech 原创 最新技术干货分享 随着3D渲染场景规模越来越复杂 单线程渲染架构在满足业务性能要求时已经捉襟见肘 因此 多线程渲染显得愈发重要 本文首先介绍了新一代图形渲染接口Metal Vulkan 以及它们的多线程渲染特性 然后
  • 复杂数据集,召回、精度等突破方法记录【以电科院过检识别模型为参考】

    目录 一 数据分析与数据集构建 二 所有相关的脚本 三 模型效果 一 数据分析与数据集构建 由于电科院数据集有17w 18w张 标签错误的非常多 且漏标非常多 但是所有有效时间只有半个月左右 显卡是M60 训练速度特别慢 所以需要尽量留足训
  • Audio在移动端的兼容性问题(1)

    需求 做一个SPA的web互动测试游戏 题目是自动切换播放的音频 根据音频内容选择正确选项 兼容移动端的微信 APP 浏览器和PC端的主流浏览器 准备 第一步 我们先查看兼容性 打开Can I Use CanIUse提供了各种浏览器所能支持
  • MarkDown学习笔记、语法 表格序号:41

    1 标题 需要在这段文字前面加上 再在 后加一个空格即可 还可增加二 三 四 五 六级标题 总共六级 只需要增加 增加一个 标题字号相应降低一级 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 二级标题 三级标题 四级标题 五级
  • 缓冲流【Buffered】

    缓冲流 Buffered 缓冲流我们理解为原来的使用数组方式进行数据传输的一种增强 按照类型分为 字符缓冲流 BufferedReader BufferedWriter 字节缓冲流 BufferedInputStream BufferedO
  • hive 计算日新、日活、更新历史表、用户留存

    创建日活记录表 linux gt vi user dau txt 1 zhansan 2023 02 10 2 lisi 2023 02 10 3 wangwu 2023 02 10 4 xiaohong 2023 02 10 5 aaa