javascript - BIgQuery UDF Javascript可在Web UI中使用,但不能嵌入

标签 javascript configuration request google-bigquery udf

我设法得到一个使用Web UI和UDF的查询。当我将其移植到嵌入式代码中时,我得到了400条答复,“缺少必需的参数”。我将我的JavaScript代码存储在Google云存储分区中,并且使用Web UI选项对其进行了测试,以使用外部代码而不是UDF编辑器框中的代码。您必须清除该文本框,然后在选项区域中选择带有此行的链接:

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选项,并得到相同的错误。
没有有关如何格式化FULL请求的文档...

作为测试,我删除了对UDF的引用,并删除了配置选项,因此请求是面包和黄油:

    var request = gapi.client.bigquery.jobs.query({
      'projectId': project_id,
      'timeoutMs': '60000',
      'query': queryAll
    });


这样做正常:没有400错误。

我的猜测是我的请求有误,但是我无法在Google网站或此处找到更详细的示例。

我还读到,有人担心UDF生活在被贬低的环境中。我正在使用UDF,因为没有它我将无法执行所需的查询。我可能可以用LAG做到这一点,但是查询总是会在OVER定义上的格式选项中被拒绝... Arggg ..

Google会非常感激高级功能完整的REAL-LIFE示例。

为了获得更好的文档:这是我的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上看到了几篇关于如何处理类似问题的文章。
我有多个具有相同处理窗口的实体,每天都有一个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的输出,以及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落后1。

我的问题是:为什么在此问题顶部缺少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,它运行良好。因此,我认为问题仅在于嵌入式作业。

我还尝试过以其他方式添加相同的功能:现在,我使用了该请求,其中在“ inLineCode”选项中将UDF添加为javascript blob。

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之外无法正常工作???谢谢。

附言如果有人可以将选项卡Big Query和UserDefinedFunctions添加到此问题的选项卡,将不胜感激。否则,谷歌的家伙可能看不到此...。

最佳答案

我认为问题是您使用了不支持UDF的Jobs: query API
因此,您需要使用具有Jobs: insert属性的configuration.query API,该属性确实支持userDefinedFunctionResources

因此,总结一下-尝试使用query方法而不是startQuery方法

关于javascript - BIgQuery UDF Javascript可在Web UI中使用,但不能嵌入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42266302/

相关文章:

javascript - 未捕获的类型错误 : Cannot read property 'root' of undefined

javascript - 在 Sinatra 助手中生成 JavaScript

java - 从导入的依赖项覆盖 Gradle 项目配置

ios - Swift 崩溃中的 HTTP 发布请求

javascript - JS : Sum of span values in For loop

javascript - 使用 JavaScript 修改与给定 CSS 类关联的 CSS 属性

git - Mercurial:启用 git subrepo

php 7 文件被下载而不是执行

Angular 2 : Nested subscribe with second subscribe inside the loop

java - 如何使用 Visual Basic 向需要字符串的服务器发出 POST 请求?