本文目录:
- 1、BigQuery中的分析函数
- 2、bigquery跟hadoop有什么区别
- 3、BigQuery SQL自动更新数据?
- 4、BigQuery中拆解字符串并平展为多行
BigQuery中的分析函数
在sql中做去重是一件麻烦的事,一般情况下只能通过group by 所有字段来做去重。
现在考虑一个简单的情形,我需要统计昨天天玩家身上的金币存量。
玩家的金币存量在一天中是多次变动的,最后一次变动的值才是玩家身上的真实存量。
那么就需要找出最后一次的记录,简单的方法是先对uid做group by,max(time)找到每个玩家的最后一次时间。
再和表本身做自连接,找到每个玩家最后的一条记录,在从中提取金币存量字段。
比如下面的这段sql:
如果在pandas中好几种可以获取最后最后一条记录的方法。
比如先按时间升序然后drop_duplicates(‘uid’, keep='last'),
又或者直接df.iloc[df.groupby('uid')['ts'].idxmax()]等,都比自连接简单的多。
在bigquery的语法中,提供了一种叫做分析函数的东西,
可以让我们不用自连接做到找出最后一条记录。
文档位置: 标准 SQL 中的分析函数概念
简单来说,它可以在保留原行数的情况下,实现一些聚合分析的结果,并保存到相应的行上。
比如说,我们有下面的数据:
只要你使用了group by uid,那么结果中就只有两行数据,aa和bb。
但是使用分析函数后还是4行。
它会在一个滑动窗口内使用一些函数,然后把结果保存在本行上。
比如计算累计和,结果就是:
在这些分析函数中,有一个last_value函数,它可以取出本窗口内的最后一个值。
既然有了最后这个概念,就一定是要有顺序了,所以使用last_value函数也必须要指定order by 字段。
然后就是滑动窗口,默认是从第一个值到当前值,即
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
我们可以指定为从开头到结束
RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
然后需要指定分组字段和排序字段,语法为:
PARTITION BY uid ORDER BY ts
这种语法是一种window的结构,它写在select语句的最后
注意最后的group by 1 2 3语句,
在上面说过,使用分析函数后,行数是不变的,
这样就有重复的数据,一个玩家有多少次金币变化记录就有多少行的重复记录,
所有需要 group by做一次去重得到最后的结果。
虽然看起来sql行数差不多,但是分析函数提供了更多的可能性,比如上面的累加和,普通的sql就是无法完成的。
bigquery跟hadoop有什么区别
二者处理数据的思路是一样的, 分布式并行处理, 某种程度上也都能完成同样的工作. 但mpp仍是关系型数据库技术, 能较好支持SQL, 使用更方便 (举例:GreenPlum) hadoop是开源平台, 本身不是数据库, 但可处理非结构化数据
BigQuery SQL自动更新数据?
sql表数据自动更新
要实现两个表之间的数据的自动更新,可以采用触发器来实现,触发器的实现方法:
1、A表有数据更新的时候自动更新B表:
create or replace trigger tg after update on A for each row
begin
update B set xx=xx where b.aid = a.id;
end;
/
2、A表插入数据时,B表更新数据:
create or replace trigger tgg after insert on A for each row
begin
insert B values(xxxx);
end;
/
如果不需要每条数据都跟新,只需要在每次A更新的时候更新B,可以将后面的for each row去掉。
BigQuery中拆解字符串并平展为多行
我在介绍bigquery的半结构化数据中介绍过我们总表的结构,
但是有些命令的参数个数是不固定的,比如玩家在一次战斗中击杀的敌人种类,
有可能有一种,也有可能有两种三种...
这种在表中是直接用#号拼接在一起的,如下所示:
上面这个例子中,本来是3行数据,some_numbers是一个数组,
然后直接把some_number接到from的后面,就可以把这个数组展开,并且和前面的id是绑定的。
参照这个例子,我们只需要使用split()函数把#号拆成数组,在接到from后面就可以变成两行了。
【bigquery】的内容来源于互联网,如引用不当,请联系我们修改。
网友留言: