Google bigquery 如何在不指定完整类型的情况下将表中的行传递给UDF?

Google bigquery 如何在不指定完整类型的情况下将表中的行传递给UDF?,google-bigquery,bigquery-standard-sql,Google Bigquery,Bigquery Standard Sql,假设我想对具有嵌套结构的表(例如)使用。当我迭代UDF的实现时,我可能想更改我在UDF中看到的字段,所以我决定将整个行从表传递给它。我的UDF最终看起来像这样: #standardSQL CREATE TEMP FUNCTION GetCommitStats( input STRUCT<commit STRING, tree STRING, parent ARRAY<STRING>, author STRUCT<name STRING,

假设我想对具有嵌套结构的表(例如)使用。当我迭代UDF的实现时,我可能想更改我在UDF中看到的字段,所以我决定将整个行从表传递给它。我的UDF最终看起来像这样:

#standardSQL
CREATE TEMP FUNCTION GetCommitStats(
  input STRUCT<commit STRING, tree STRING, parent ARRAY<STRING>,
               author STRUCT<name STRING, email STRING, ...>>)
  RETURNS STRUCT<
    parent ARRAY<STRING>,
    author_name STRING,
    diff_count INT64>
  LANGUAGE js AS """
[UDF content here]
""";
UDF声明中最麻烦的部分是输入结构,因为我必须包含所有嵌套字段及其类型。有更好的方法吗?

您可以使用它将任意结构和数组转换为JSON,然后在您的UDF中将其解析为对象以进行进一步处理。比如说,

#standardSQL
CREATE TEMP FUNCTION GetCommitStats(json_str STRING)
  RETURNS STRUCT<
    parent ARRAY<STRING>,
    author_name STRING,
    diff_count INT64>
  LANGUAGE js AS """
var row = JSON.parse(json_str);
var result = new Object();
result['parent'] = row.parent;
result['author_name'] = row.author.name;
result['diff_count'] = row.difference.length;
return result;
""";

SELECT GetCommitStats(TO_JSON_STRING(t)).*
FROM `bigquery-public-data.github_repos.sample_commits` AS t;
您可以使用将任意结构和数组转换为JSON,然后在UDF中将其解析为对象以进行进一步处理。比如说,

#standardSQL
CREATE TEMP FUNCTION GetCommitStats(json_str STRING)
  RETURNS STRUCT<
    parent ARRAY<STRING>,
    author_name STRING,
    diff_count INT64>
  LANGUAGE js AS """
var row = JSON.parse(json_str);
var result = new Object();
result['parent'] = row.parent;
result['author_name'] = row.author.name;
result['diff_count'] = row.difference.length;
return result;
""";

SELECT GetCommitStats(TO_JSON_STRING(t)).*
FROM `bigquery-public-data.github_repos.sample_commits` AS t;

在没有官方文档的情况下,您是如何发现所有这些有价值的信息的?是否有遗留sql解决方案?否。BigQuery团队正在优先考虑所有新功能开发的标准sql。在没有官方文档的情况下,您是如何发现所有这些有价值的信息的?是否有遗留sql解决方案?否。BigQuery团队正在优先考虑所有新功能开发的标准sql所有新功能的开发。
#standardSQL
CREATE TEMP FUNCTION GetCommitStats(json_str STRING)
  RETURNS STRUCT<
    parent ARRAY<STRING>,
    author_name STRING,
    diff_count INT64>
  LANGUAGE js AS """
var row = JSON.parse(json_str);
var result = new Object();
result['parent'] = row.parent;
result['author_name'] = row.author.name;
result['diff_count'] = row.difference.length;
return result;
""";

SELECT
  GetCommitStats(TO_JSON_STRING(
    STRUCT(parent, author, difference)
  )).*
FROM `bigquery-public-data.github_repos.sample_commits`;