我正在尝试在 BigQuery 中执行空回填,类似于 Panda 的数据帧 bfill。阅读文档,该last_value函数似乎是一个不错的选择。然而,这会留下一些null位置,直到找到第一个值(考虑到函数的名称,这是相当合理的)。我怎样才能回填这些null?或者我必须放弃它们?
这是一个示例查询:
select table_path.*, last_value(sn_6 ignore nulls) over (order by time)
from (select 1 as time, null as sn_6 union all
select 2, 1 union all
select 3, null union all
select 4, null union all
select 5, null union all
select 6, 0 union all
select 7, null union all
select 8, null
) table_path;
Run Code Online (Sandbox Code Playgroud)
实际输出:
time sn_6 f0_
1 null null
2 1 1
3 null 1 …Run Code Online (Sandbox Code Playgroud) 我想将数据流式传输到 BigQuery 中,并且正在考虑使用 PubSub + Cloud Functions,因为不需要转换(至少目前如此),并且使用 Cloud Data Flow 感觉只是将行插入到表中有点过头了。我说得对吗?
数据使用 Python 脚本从 GCP VM 流式传输到 PubSub,其格式如下:
{'SEGMENT':'datetime':'2020-12-05 11:25:05.64684','values':(2568.025,2567.03)}
Run Code Online (Sandbox Code Playgroud)
BigQuery 架构是datetime:timestamp, value_A: float, value_B: float.
我对这一切的疑问是:
a) 我是否需要将其作为 json/字典推送到 BigQuery 中,所有值都作为字符串,还是必须使用表的数据类型?
BQ.insert_rows_jsonb) 使用和之间有什么区别,BQ.load_table_from_json我应该使用哪一个来完成这项任务?
编辑:
我想要获取的实际上是一些资产的市场数据。假设大约 28 种金融工具并捕捉它们的所有价格变动。平均每天,每个工具有约 60.k 个报价,因此我们谈论的是每月约 3360 万次调用。(目前)需要的是将它们插入到表中以供进一步分析。我目前不确定是否应该执行真正的流处理或每批加载。由于该项目尚未进行分析,我认为不需要数据流,但应该使用 PubSub,因为它可以在时机成熟时更轻松地扩展到数据流。这是我第一次实现流管道,我正在使用我通过课程和阅读学到的所有知识。如果我的方法错误,请纠正我:)。
例如,我绝对想做的是,当一个价格变动与第 n 个价格变动之间的价格差异为 10 时,对另一个表执行另一次插入。为此,我应该使用数据流还是云函数方法仍然有效吗?因为这就像一个触发条件。基本上,触发器类似于:
if price difference >= 10:
process all these ticks
insert the results in this table
Run Code Online (Sandbox Code Playgroud)
但我不确定如何实现这个触发器。
stream python-3.x google-bigquery google-cloud-pubsub google-cloud-functions