将带有变量的循环转换为 BigQuery SQL

2024-04-29

我有数千个脚本,其中包括循环数据集并使用变量进行累积。例如:

// assuming that 'ids' is populated from some BQ table
ids = [1, 2, 3, 4, 5]
var1 = "v1"   //initialize variable
var2 = "v2"   //initialize variable

for id in ids
    var1 = var2
    if (id > 2)
      var2 = var1 + "-" + item
    else
      var2 = id
    print(id, var1, var2)

这将产生以下输出:

1,v2,1
2,1,2
3,2,2-3
4,2-3,2-3-4
5,2-3-4,2-3-4-5

其他一些需要考虑的事情:

  • 脚本可以涉及 n 个变量。
  • 变量可以充当 累加器或者可以简单地有文字。
  • 循环中的条件可以是 更复杂,多重嵌套if / else状况。
  • 脚本也可以有嵌套循环,它会循环 n 次或直到不满足某些条件。

BigQuery SQL 是否可以支持它?我也对 BigQuery UDF 持开放态度,但 UDF 不支持可变状态。

另外,由于有数千个这样的脚本,我不想手动执行,而是想自动转换。解析这些脚本对我来说不是问题,我只需要将其转换为等效的 BigQuery SQL。让我知道如何解决这个问题。

Edit:虽然我更倾向于仅使用 SQL 方法但是BigQuery 脚本 https://cloud.google.com/blog/products/data-analytics/command-and-control-now-easier-in-bigquery-with-scripting-and-stored-procedures似乎也是有前途的选择。


我已经成功地在 BigQuery 中使用 SQL UDF 重现了您的脚本,我使用了 StandardSQL 而不是 Legacy SQL,您可以阅读更多相关信息here https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions。我想说 UDF 支持 JavaScript,我发现使用它的功能来编写它更好。

我使用这个虚拟数据而不是声明一个数组:

下面是我开发的脚本,用于重现您使用代码完成的工作。

DECLARE VAR1 STRING DEFAULT 'v1';
DECLARE var2 STRING DEFAULT 'v2';

CREATE TEMPORARY FUNCTION test_v2 ( x1 string , x2 string,id INT64)
RETURNS STRING
LANGUAGE js AS """
var output= new Array(); 
i =0;
          while(i <= 5){
          x1=x2;
          if(i > 2) {
            x2 =x1 + " - " + i ;
            output.push(x2);

          } else{
                  x2 = i;
                  output.push(x2);
                } 
          i++;}return  output[id];
""";

CREATE TEMPORARY FUNCTION test_v1 ( x1 string , x2 string,id INT64)
RETURNS STRING
LANGUAGE js AS """
var output= new Array(); 
i =1;
output.push(x1);
          while(i <= 5){
          x1 = x2;
          if(i > 2) {
            x2 =x1 + " - " + i ;
            output.push(x1);

          } else{
                  output.push(x1);
                  x2 = i;
                } 
          i++;}return  output[id];
""";

SELECT ids,test_v1(var1,var2,ids) as v1, test_v2(var1,var2,ids) as var2 FROM `test-proj-261014.sample.ids` LIMIT 1000

请注意,我必须编写两个不同的函数,每一行一个函数var1 and var2。此外,该数组从位置 1 开始test_v1功能。

最后,输出是:

我希望它有帮助。

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

将带有变量的循环转换为 BigQuery SQL 的相关文章

随机推荐

  • 在 Pandas DataFrame 中拆分列表

    我有一个包含多列的 csv 文件 使用 pandas 我将此 csv 文件读入数据帧 并有一个日期时间索引和五六个其他列 其中一列是时间戳列表 下面带有索引的示例 CreateDate TimeStamps 4 1 11 Timestamp
  • 我想隐藏工具提示中的标签,因为它显示未定义

    我正在使用 Chart js 来显示折线图 如何隐藏 Chart js 折线图的工具提示标签 工具提示中的标签显示undefined所以我想隐藏标签 请参见屏幕截图 也许有一种方法可以修改工具提示 让我只能在工具提示中显示图例值 我的代码如
  • 如何在 Intellij IDEA 实时模板 groovy 脚本中将变量传递给 groovy 代码?

    我有一个groovyScript in my IntellijIDEA 实时模板 如下所示 groovyScript D test groovy v1 on my D test groovy我有这样的代码 if v1 abc abc 现在我
  • 与云无关的架构? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在对一个新解决方案进行一些架构工作 该解决方案最初将在 Windows Azure 中运行 不过 我希望解决方案 或至少是架构 设计 与云无
  • Firebase 事件未从 Android 服务记录

    我的 Android 应用程序中有一个音乐流媒体服务 我试图使用 Fire base 事件日志记录流媒体音乐 我相应地实现了所有内容 我可以从我的活动中看到事件 但不能从我的服务中看到事件 我是否遗漏了某些内容 或者 firebase 不支
  • 如何捕获 PHP 中的 cURL 错误

    我在用PHP curl功能 https php net manual en ref curl php将数据从我的本地计算机发布到网络服务器 我的代码如下 c curl init curl setopt c CURLOPT URL url c
  • 动态创建消费者spring kafka

    我正在创建一个与另一个服务通信的服务 以便识别要收听的 kafka 主题 kafka主题可能有不同的键和值类型 因此 我想为每个配置 主题 键类型 值类型 动态创建不同的 kafka 消费者 其中配置仅在运行时已知 然而在 spring k
  • ASP.net kerberos 偶尔下降到 NTLM

    背景 仅相关部分 我们有一个大型 Intranet asp net 2 0 3 5 应用程序 Web服务器是AD域上的Windows Server 2003 客户端使用 Windows IE 6 8 Windows 身份验证 具有从 Win
  • PHP内部hashCode函数

    我正在寻找与 JAVA 等效的 PHP SomeString hashCode 功能 我正在寻找的 hashCode 应该与 PHP 中用于索引 Hashmap 的 hashCode 相同 我希望你可以帮助我 EDIT 好的 找到了我正在搜
  • WPF 重复按钮 MouseUp

    有没有办法让重复按钮上的 MouseUpevent 在不再按下按钮时触发 我试图使用 MouseMove 事件来跟踪按下按钮时鼠标的位置 但 MouseDown 和 MouseUp 都不会触发鼠标左键的事件 关于可以做什么的任何想法或建议
  • 如何将图像(位图)调整为给定尺寸? [复制]

    这个问题在这里已经有答案了 如何以编程方式将图像 位图 大小调整为例如 800 480 我在我的应用程序中检索了一张约 1MB 的图片 我需要将其缩小到 800 480 我已经加载了该图片并对其进行了压缩 但是如何使其变小 ByteArra
  • 选择组合框文本

    我有一个组合框声明如下
  • 将Pycharm项目移动到另一个目录

    我的主目录空间不足 我想将 PyCharm 项目移动到另一个目录 我最终复制了它 因为重构不起作用 我删除了 pycache 和 zip 异常 出现的异常消失了 现在一切都按预期工作 不过 从 settings python interpr
  • 如何使用 GitHub README 中的 Markdown 渲染多列?

    为了呈现三列中的项目 我尝试将以下 CSS3 指令添加到我的项目中README md文件 但样式被删除 div div style display inline block div div div div
  • 从我的应用程序创建日历事件,无需默认提醒

    我正在开发一个应用程序 可以创建 更新和删除原生 Google 日历中的事件 我正在通过以下代码创建一个事件 ContentValues cvEvent new ContentValues cvEvent put Events DTSTAR
  • `geom_line()` 连接映射到不同组的点

    我想group我的数据基于两个变量的相互作用 但仅将美学映射到其中一个变量 另一个变量代表重复 理论上 它们应该彼此相等 我可以找到不优雅的方法来做到这一点 但似乎应该有更优雅的方法来做到这一点 例如 Data frame with two
  • 如何使用 url_for() 将路径和查询数据传递到使用 FastAPI 和 Jinja2 的路由?

    我想从 Jinja2 模板中调用 FastAPI 路由 并传递两者path and query该路由的数据 参数 我在 Jinja2 模板中尝试过如下所示 url for function1 uustr data uustr interva
  • 从 R 中的 Sys.Date() 获取当前时间(包括秒)

    我确信这是非常基本的 但我无法从系统日期中提取各种时间 简而言之 我不确定为什么我无法使用 M 或 S 准确提取当前的分钟和秒数 有什么想法吗 我的机器上当前时间为中午 12 38 gt format Sys Date c 1 12 16
  • “冲突可序列化”和“冲突等效”有什么区别?

    在数据库理论中 冲突可序列化 和 冲突等效 有什么区别 我的教科书有一个关于可序列化冲突的部分 但掩盖了冲突等价性 这些可能都是我熟悉的概念 但我不熟悉术语 所以我正在寻找解释 DBMS 中的冲突可以定义为两个或多个不同的事务访问同一变量
  • 将带有变量的循环转换为 BigQuery SQL

    我有数千个脚本 其中包括循环数据集并使用变量进行累积 例如 assuming that ids is populated from some BQ table ids 1 2 3 4 5 var1 v1 initialize variabl