我需要在 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
答案 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') )))