2017-01-03 6 views
1

Как я могу присоединиться к двум таблицам в инструкции select, в которой я также использую UDF? Я сохранил SQL-запрос и функцию UDF в двух файлах, которые я вызываю через командную строку bq. Однако, когда я бегу, я получаю следующее сообщение об ошибке:BigQuery join и UDF

BigQuery error in query operation: Error processing job '[projectID]:bqjob_[error_number]': Table name cannot be resolved: dataset name is missing.

Обратите внимание, что я вошел в правильном проекте через метод gcloud AUTH. My SQL заявление:

SELECT 
    substr(date,1,6) as date, 
    device, 
    channelGroup, 
    COUNT(DISTINCT CONCAT(fullVisitorId,cast(visitId as string))) AS sessions, 
    COUNT(DISTINCT fullVisitorId) AS users, 
FROM 
    defaultChannelGroup(
    SELECT 
     a.date, 
     a.device.deviceCategory AS device, 
     b.hits.page.pagePath AS page, 
     a.fullVisitorId, 
     a.visitId, 
     a.trafficSource.source AS trafficSourceSource, 
     a.trafficSource.medium AS trafficSourceMedium, 
     a.trafficSource.campaign AS trafficSourceCampaign 
    FROM FLATTEN(
     SELECT date,device.deviceCategory,trafficSource.source,trafficSource.medium,trafficSource.campaign,fullVisitorId,visitID 
     FROM 
     TABLE_DATE_RANGE([datasetname.ga_sessions_],TIMESTAMP('2016-10-01'),TIMESTAMP('2016-10-31')) 
    ,hits) as a 
    LEFT JOIN FLATTEN(
     SELECT hits.page.pagePath,hits.time,visitID,fullVisitorId 
     FROM 
     TABLE_DATE_RANGE([datasetname.ga_sessions_],TIMESTAMP('2016-10-01'),TIMESTAMP('2016-10-31')) 
     WHERE 
     hits.time = 0 
     and trafficSource.medium = 'organic' 
    ,hits) as b 
    ON a.fullVisitorId = b.fullVisitorId AND a.visitID = b.visitID 
) 
GROUP BY 
    date, 
    device, 
    channelGroup 
ORDER BY sessions DESC 

где я заменил мой datasetname с правильным названием, конечно; и некоторые из ОДС (который работает с другим запросом):

function defaultChannelGroup(row, emit) 
{ 
    function output(channelGroup) { 
    emit({channelGroup:channelGroup, 
     fullVisitorId: row.fullVisitorId, 
     visitId: row.visitId, 
     device: row.device, 
     date: row.date 
     }); 
    } 
    computeDefaultChannelGroup(row, output); 
} 

bigquery.defineFunction(
    'defaultChannelGroup', 
    ['date', 'device', 'page', 'trafficSourceMedium', 'trafficSourceSource', 'trafficSourceCampaign', 'fullVisitorId', 'visitId'], 
    //['device', 'page', 'trafficSourceMedium', 'trafficSourceSource', 'trafficSourceCampaign', 'fullVisitorId', 'visitId'], 
    [{'name': 'channelGroup', 'type': 'string'}, 
    {'name': 'fullVisitorId', 'type': 'string'}, 
    {'name': 'visitId', 'type': 'integer'}, 
    {'name': 'device', 'type': 'string'}, 
    {'name': 'date', 'type': 'string'} 
], 
    defaultChannelGroup 
); 
+0

Я не смог воспроизвести. (Некоторые члены команды BigQuery также могут просмотреть журнал, если вы тоже оставите свой полный идентификатор задания) –

+0

Спасибо @FelipeHoffa. Я пробовал это сегодня утром с помощью следующей команды: 'bq query --udf_resource = Desktop/bq.js" $ (cat Desktop/bq-sd-mkt-channels.sql) "' и получил то же сообщение об ошибке, т.е. : 'bqjob_r324a276c6f5130bc_000001596949a59f_1 ': имя таблицы не может быть разрешено: имя набора данных отсутствует' – kekchoze

ответ

1

Отборные операторы внутри функции Свести необходимое, чтобы быть в скобках.

Ран команду Бк в оболочке: bq query --udf_resource=udf.js "$(cat query.sql)"

query.sql содержит следующие сценарии:

SELECT 
    substr(date,1,6) as date, 
    device, 
    channelGroup, 
    COUNT(DISTINCT CONCAT(fullVisitorId,cast(visitId as string))) AS sessions, 
    COUNT(DISTINCT fullVisitorId) AS users, 
    COUNT(DISTINCT transactionId) as orders, 
    CAST(SUM(transactionRevenue)/1000000 AS INTEGER) as sales 
FROM 
    defaultChannelGroup(
    SELECT 
     a.date as date, 
     a.device.deviceCategory AS device, 
     b.hits.page.pagePath AS page, 
     a.fullVisitorId as fullVisitorId, 
     a.visitId as visitId, 
     a.trafficSource.source AS trafficSourceSource, 
     a.trafficSource.medium AS trafficSourceMedium, 
     a.trafficSource.campaign AS trafficSourceCampaign, 
     a.hits.transaction.transactionRevenue as transactionRevenue, 
     a.hits.transaction.transactionID as transactionId 
    FROM FLATTEN((
     SELECT date,device.deviceCategory,trafficSource.source,trafficSource.medium,trafficSource.campaign,fullVisitorId,visitID, 
       hits.transaction.transactionID, hits.transaction.transactionRevenue 
     FROM 
     TABLE_DATE_RANGE([datasetname.ga_sessions_],TIMESTAMP('2016-10-01'),TIMESTAMP('2016-10-31')) 
    ),hits) as a 
    LEFT JOIN FLATTEN((
     SELECT hits.page.pagePath,hits.time,trafficSource.medium,visitID,fullVisitorId 
     FROM 
     TABLE_DATE_RANGE([datasetname.ga_sessions_],TIMESTAMP('2016-10-01'),TIMESTAMP('2016-10-31')) 
     WHERE 
     hits.time = 0 
     and trafficSource.medium = 'organic' 
    ),hits) as b 
    ON a.fullVisitorId = b.fullVisitorId AND a.visitID = b.visitID 
) 
GROUP BY 
    date, 
    device, 
    channelGroup 
ORDER BY sessions DESC 

и udf.js содержит следующие функции (функция 'computeDefaultChannelGroup' не входит):

function defaultChannelGroup(row, emit) 
{ 
    function output(channelGroup) { 
    emit({channelGroup:channelGroup, 
     date: row.date, 
     fullVisitorId: row.fullVisitorId, 
     visitId: row.visitId, 
     device: row.device, 
     transactionId: row.transactionId, 
     transactionRevenue: row.transactionRevenue, 
     }); 
    } 
    computeDefaultChannelGroup(row, output); 
} 

bigquery.defineFunction(
    'defaultChannelGroup', 
    ['date', 'device', 'page', 'trafficSourceMedium', 'trafficSourceSource', 'trafficSourceCampaign', 'fullVisitorId', 'visitId', 'transactionId', 'transactionRevenue'], 
    [{'name': 'channelGroup', 'type': 'string'}, 
    {'name': 'date', 'type': 'string'}, 
    {'name': 'fullVisitorId', 'type': 'string'}, 
    {'name': 'visitId', 'type': 'integer'}, 
    {'name': 'device', 'type': 'string'}, 
    {'name': 'transactionId', 'type': 'string'}, 
    {'name': 'transactionRevenue', 'type': 'integer'} 
], 
    defaultChannelGroup 
); 

Отклонено без ошибок и сопоставлено данными в Google Analytics.