BigQuery UDF - 访问嵌套在 2 个级别上的 RECORD 的叶值

BigQuery UDF - Accessing leaf value of a RECORD nested on 2 levels

我正在尝试将嵌套的 RECORD 传递到我的 passthrough UDF 函数,该函数对 logMessage 执行一些操作,然后 returns 一个字符串。但是我无法找到包含 logMessage 的正确叶子。我找不到处理多层嵌套的示例。我是否需要对嵌套记录执行其他操作才能访问 2 级深的 logMessage 字符串?我怀疑答案一定很简单,但由于我的查询正在执行,但结果只是为每条记录返回 "null" (可能是因为我发出了一个不存在的叶子或我缺少一些逻辑),我真的不知道如何调试它。

数据架构:

[{"name":"proto","mode":"repeated","type":"RECORD",
    "fields":
    [
        {"name":"line","mode":"repeated","type":"RECORD",
            "fields":
            [
                {"name": "logMessage","type": "STRING"}
            ]
        }
    ]
}]

这是我的 SQL:

SELECT
url
FROM (passthrough(
SELECT
  proto.line.logMessage
FROM
  [mydata]
))

我的 UDF(我现在正在为每条记录返回值 - returns "null"):

function passthrough(row, emit) {
  emit({url: row.proto.line.logMessage}); 
}

bigquery.defineFunction(
  'passthrough',
  ['proto.line.logMessage'],
  [{'name': 'url', 'type': 'string'}],
  passthrough
);

我认为,下面的情况与您的情况非常相似:

SELECT body
FROM JS( 
  ( // input table 
  SELECT payload.comment.body
  FROM [publicdata:samples.github_nested]
  WHERE actor = 'shiftkey'
  AND payload.comment.body IS NOT NULL
  ), 
  payload.comment.body, // input columns 
  "[ // output schema 
     {'name': 'body', 'type': 'STRING'
     }
  ]", 
  "function(row, emit) { // function 
    emit({body: row.payload.comment.body}); 
  }"
) 

您正在使用重复条记录,重复的字段在JS中表示为数组。所以你可能需要这样的东西:

function passthrough(row, emit) {
  emit({url: row.proto[0].line[0].logMessage}); 
}

如果您想在 BigQuery 之外调试您的 UDF,请尝试使用此测试工具:

http://storage.googleapis.com/bigquery-udf-test-tool/testtool.html

您可以通过单击 BQ 网络 "Preview" 按钮 UI 然后单击 "JSON" 来为您的 UDF 生成与数据的确切结构匹配的输入数据获取数据的可复制粘贴 JSON 表示。