BigQuery中的用户定义函数使用带有点的列名

时间:2017-01-18 13:10:22

标签: javascript sql google-bigquery

我需要在 BigQuery 中创建自定义(user defined)JS功能。首先,我想基于Google示例创建简单的“启动器”,但在我的情况下,我需要使用带有点名称的列中的数据(例如“hits.item.transactionId”),这会返回错误。

我的用户定义函数 UDF编辑器中的代码):

function passthroughExample(row, emit) {
  emit({outputA: row.fullVisitorId, outputB: row.transactionId});
}

bigquery.defineFunction(
  'passthrough',
  ['fullVisitorId', 'transactionId'],
  [{'name': 'outputA', 'type': 'string'},
   {'name': 'outputB', 'type': 'string'}],
  passthroughExample
);

我的 SQL 选择使用了我的passthroughExample()函数:

SELECT
  outputA, outputB
FROM
  (passthrough(SELECT fullVisitorId, hits.item.transactionId AS transactionId FROM TABLE_DATE_RANGE( [00000000.ga_sessions_], TIMESTAMP('2016-01-01'), TIMESTAMP('2016-01-05') )))

我收到了消息:

错误:不支持的别名:无法访问字段hits.item.transactionId作为transactionId

2 个答案:

答案 0 :(得分:1)

为此目的,最好使用标准SQL而不是旧版SQL。您可以在the documentation中阅读有关用户定义函数的信息。在你的情况下,你会想要这样的东西:

#standardSQL
CREATE TEMP FUNCTION passthrough(fullVisitorId INT64, transactionId STRING)
RETURNS STRUCT<outputA INT64, outputB STRING>
LANGUAGE js AS """
var res = new Object();
res.outputA = fullVisitorId;
res.outputB = transactionId;
return res;
""";

SELECT passthrough(hit.item.fullVisitorId, transactionId).*
FROM `your_dataset.ga_sessions_*`
CROSS JOIN UNNEST(hits) AS hit
WHERE _TABLE_SUFFIX BETWEEN '2016-01-01' AND '2016-01-05';

传统与标准SQL中用户定义函数之间的一些差异在the migration guide中进行了解释。

答案 1 :(得分:0)

尝试使用UDF中的别名:

bigquery.defineFunction(
  'passthrough',
  ['fullVisitorId', 'hits.item.transactionId'],
  [{'name': 'outputA', 'type': 'string'},
   {'name': 'outputB', 'type': 'string'}],
  passthroughExample
);

查询中没有别名:

SELECT
  outputA, outputB
FROM
  (passthrough(SELECT fullVisitorId, hits.item.transactionId FROM TABLE_DATE_RANGE( [00000000.ga_sessions_], TIMESTAMP('2016-01-01'), TIMESTAMP('2016-01-05') )))