【问题标题】:UDF that returns a table返回表的 UDF
【发布时间】:2019-03-28 04:41:36
【问题描述】:

在 BigQuery 中,如何编写返回表的 UDF?我想要的是能够接受参数的 CTE。据我所知,UDF 只返回标量,对吗?

【问题讨论】:

    标签: google-bigquery user-defined-functions


    【解决方案1】:

    UDF 可以返回不同类型的数组,包括 STRUCT 的数组

    但显然它与返回表不一样,BigQuery UDF [尚未] 真正支持它

    附:如果您有想要解决的具体问题 - 提出具体问题,有人会帮助您

    下面是两个相对幼稚和无用(从实际角度来看)的示例 - 但我希望它们展示使用 ARRAYS 在某种程度上模仿 CTE 的概念

    示例 #1

    #standardSQL
    CREATE TEMPORARY FUNCTION pseudoCTE(x INT64, y INT64) AS (
      GENERATE_ARRAY(x, y)
    );
    SELECT * FROM UNNEST(pseudoCTE(1,5)) z   
    

    结果

    Row z    
    1   1    
    2   2    
    3   3    
    4   4    
    5   5    
    

    示例 #2

    #standardSQL
    CREATE TEMPORARY FUNCTION pseudoCTE(x INT64, y INT64) AS (
      ARRAY(SELECT AS STRUCT z AS id, RAND() AS value
      FROM UNNEST(GENERATE_ARRAY(x, y)) z)
    );
    SELECT * FROM UNNEST(pseudoCTE(1,5))   
    
    Row id  value    
    1   1   0.9319445195173228   
    2   2   0.36404932965409453  
    3   3   0.4615807541752828   
    4   4   0.5504890432993448   
    5   5   0.29635275888268836  
    

    【讨论】:

      【解决方案2】:

      在 BigQuery 中,您现在拥有 table functions

      表函数,也称为表值函数 (TVF),是一种返回表的用户定义函数。

      一个示例(可在 Google 文档中找到):

      CREATE OR REPLACE TABLE FUNCTION mydataset.names_by_year(y INT64)
      AS
        SELECT year, name, SUM(number) AS total
        FROM `bigquery-public-data.usa_names.usa_1910_current`
        WHERE year = y
        GROUP BY year, name
      

      执行它:

      SELECT * FROM mydataset.names_by_year(1950)
      ORDER BY total DESC
      LIMIT 5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-17
        • 2011-05-09
        • 2021-11-21
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        相关资源
        最近更新 更多