我设法使用Web UI和UDF进行查询。当我把它移植到我的嵌入代码时,我得到了一个400回复,“缺少必需的参数”。我有我的JavaScript代码在谷歌云存储桶中,我用Web UI选项测试它使用外部代码而不是UDF编辑框中的代码。你要清楚该文本框,然后选择这条线在选项区域中的链接:BIgQuery UDF Javascript在网络用户界面中工作但未嵌入
UDF Source URIs Edit Inline UDF
因此,这意味着BQ的Web UI是找到我的UDF和它的作品一样,在该UDF编辑器相同的代码。我的猜测是请求格式不正确。
我正在按照文档修改查询......文档是[here] [1],显然只是完整请求API的一个片段。
"configuration": {
"query": {
"userDefinedFunctionResources": [
{
"inlineCode": "var someCode = 'here';"
},
{
"resourceUri": "gs://some-bucket/js/lib.js"
}
],
"query": "select a from myFunc(T);"
}
}
我的解释是这样:
var request = gapi.client.bigquery.jobs.query({
'projectId': project_id,
'timeoutMs': '60000',
'configuration': {
'query' : {
'userDefinedFunctionResources': [
{
'inlineCode' : ''
},
{
'resourceUri': 'gs://cloudfiledatetype/UDF/udfLatestProcTimeAllRegions.js'
}
],
'query': queryAll
}
}
});
顺便说一句,我试图删除inLineCode选项,并得到了同样的错误。 有关于如何格式化完整的请求没有文档...
作为测试,我删除了参考UDF和删除的配置选项,因此请求是面包,黄油:
var request = gapi.client.bigquery.jobs.query({
'projectId': project_id,
'timeoutMs': '60000',
'query': queryAll
});
这工作正常:没有400错误。
我的猜测是我的请求中有错误,但我无法在Google网站或SO中找到更详细的示例。
我还读到,有人担心UDF生活在一个正在被剥夺。我正在使用UDF,因为如果没有它,我无法获得所需的查询。我可以用LAG做它,但查询总是被OVER定义上的格式选项拒绝... Arggg ..
完整的高级功能的真实生活实例真的很受赞赏Google。
为了更好的文档:这里是我的UDF:
var lastInputA = -1;
function passthroughExample(row, emit) {
// handle
if (row.inputA != lastInputA) {
emit({outputC: row.inputC});
}
lastInputA = row.inputA;
}
bigquery.defineFunction(
'passthrough', // Name of the function exported to SQL
['inputA', 'inputB', 'inputC'], // Names of input columns
[{'name': 'outputC', 'type': 'integer'}],
passthroughExample // Reference to JavaScript UDF
);
它做的东西很简单,但我已经看到了如何处理类似的问题上SO一对夫妇的职位。 我有多个entier与相同的进程窗口,每天的startTime和endTime,但在不同的日子处理不同的进程时间。我想选择后者,因为它有最新的代码。注意代码只输出最新的处理时间。这样,在查询我能做到这一点
WHERE
processTime IN ((
SELECT
outputC
FROM
passthrough (
SELECT
summaryStartTimeStamp AS inputA,
summaryEndTimeStamp AS inputB,
processTime AS inputC
如果你做一个查询来获取所有的日子,为了与上升开始时间和下降过程时,你得到了最新的处理时间,然后行具有重复的startTime和endTime以及更早的处理时间的行。因此,UDF找到startTime更改并发出此行的时间。它会拒绝行,直到startTime再次更改。
以下是UDF之前的数据示例。这是UDF的输入。
summaryStartTimeStamp summaryEndTimeStamp processTime
1468206000000 1468292400000 1478668368824
1468206000000 1468292400000 1474504378494
1468206000000 1468292400000 1472261683703
1468206000000 1468292400000 1471908635453
1468292400000 1468378800000 1478668668857
1468292400000 1468378800000 1474504654098
1468292400000 1468378800000 1472261923772
1468292400000 1468378800000 1471908956622
1468378800000 1468465200000 1478669028973
1468378800000 1468465200000 1474504910553
1468378800000 1468465200000 1472262223831
1468378800000 1468465200000 1471916440493
1468465200000 1468551600000 1478669269089
1468465200000 1468551600000 1474505174929
1468465200000 1468551600000 1472262463965
1468465200000 1468551600000 1471917212326
这里的UDF的输出与redudant线取出,并在outputC最新的处理时间
outputA outputB outputC
1468206000000 1468292400000 1478668368824
1468292400000 1468378800000 1478668668857
1468378800000 1468465200000 1478669028973
1468465200000 1468551600000 1478669269089
这里是在WebUI使用UDF查询...
SELECT
outputA, outputB, outputC
FROM
passthrough (
SELECT summaryStartTimeStamp as inputA, summaryEndTimeStamp as inputB, processTime as inputC
FROM
[xxx removed ]
WHERE
eventType == "MAPFIT"
GROUP BY
inputA, inputB, inputC
ORDER BY
inputA,inputC DESC
LIMIT
1000)
ORDER by outputA
LIMIT 1000
在UDF编辑器窗口中使用此UDF
var lastInputA = -1;
function passthroughExample(row, emit) {
// handle
if (row.inputA != lastInputA) {
emit({outputC: row.inputC});
}
lastInputA = row.inputA;
}
bigquery.defineFunction(
'passthrough',
['inputA', 'inputB', 'inputC'],
[{'name': 'outputC', 'type': 'integer'}],
passthroughExample
);
在这个例子中,我输出了可读性的开始和结束时间。在内联代码中,我使用了只输出处理时间的修改版本,因此请选择子查询中的进程时间。
我可以做到这一点没有UDF通过具有相同的查询,然后检测与startTime不等于startTime滞后一。
我的问题是:为什么在这个问题上的JavaScript格式的请求缺少必要的参数..谢谢
更新: 我一直在试图请求定义的所有可能的组合,我有一个不同错误现在..我摆脱了“400:所需参数丢失”的错误。现在我得到“400,未知的TVF:直通”。 “passthrough”是UDF的名称。
所以看起来请求的JSON解析器已满足配置,但它仍然无法找到UDF。这里是新的请求定义:
requests = gapi.client.bigquery.jobs.query({
'projectId': project_id,
'timeoutMs': '60000',
"userDefinedFunctionResources": [
{
"resourceUri": "gs://cloudfiledatetype/UDF/udfLatestProcTimeAllRegions.js"
},
],
'query': queryAll
});
请注意,如果我在WebUI中发出查询并指向此UDF,它运行良好。因此,我认为这个问题只是嵌入式工作。
我也尝试以另一种方式添加相同的功能:现在我使用了这个请求,其中UDF作为javascript blob添加到“inLineCode”选项中。
requests = gapi.client.bigquery.jobs.query({
'projectId': project_id,
'timeoutMs': '60000',
"userDefinedFunctionResources": [
{
"inlineCode": "var lastInputA = -1; function passthroughExample(row, emit) { if (row.inputA != lastInputA) { emit({outputC: row.inputC}); } lastInputA = row.inputA;} bigquery.defineFunction( 'passthrough', ['inputA', 'inputB', 'inputC'], [{'name': 'outputC', 'type': 'integer'}], passthroughExample);"
}
],
'query': queryAll
});
再一次,我得到了一个“未知TVF:直通”的400响应。 所以我不知道为什么这是失败的......这是我的请求定义还是UDF不工作的WebUI外?谢谢。
P.S.如果有人可以将Big Query标签和UserDefinedFunctions标签添加到这个问题的标签页中,那就非常感谢。否则,在谷歌的人可能看不到这一点....
任何人只要有足够的积分,请能够改变这个标签,包括大的查询和UserdefinedFunctions以便在谷歌的家伙可以看到它。我认为它的功能相当基本的问题......其在WebUI中的工作正常,但没有在正常的工作调用......感谢 – Paul