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 表示。
我正在尝试将嵌套的 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 表示。