云服务器免费试用

bigquery(BigQuery判断当前日期是月末日期)

服务器知识 0 908

本文目录:

  • 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】的内容来源于互联网,如引用不当,请联系我们修改。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942@qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: bigquery(BigQuery判断当前日期是月末日期)
本文地址: https://solustack.com/27991.html

相关推荐:

网友留言:

我要评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。