2017-06-19 102 views
0

我在BigQuery中創建了一個UDF,並像在FROM子句中使用UDF的文檔(https://cloud.google.com/bigquery/user-defined-functions#creating-the-query)中的示例那樣運行它。在UDF查詢中將UDF用作BigQuery

但是,我需要的是在select中將UDF用作列。

舉一個例子 - 這是我的函數返回每個座標在全球的四分之一是:

function getQuarter(row, emit) { 
    emit({quarter: getQuarterHelper(row.lon,row.lat)}); 
} 

function getQuarterHelper(lon,lat) { 
    try { 
    var NS = lat > 0 ? 'N' : 'S'; 
    var EW = lon > 0 ? 'E' : 'W'; 
    return(NS + EW); 
    } catch (ex) { 
    return 'N/A'; 
    } 
} 

bigquery.defineFunction(
    'getQuarter', 
    ['lon', 'lat'], //input columns 
    [{name: 'quarter', type: 'string'}], //output 
    getQuarter 
); 

這工作:

SELECT quarter 
FROM 
    getQuarter(
    SELECT lon,lat 
    FROM [table_name] 
) 

但是這一點,例如,是不是:

SELECT location_title, getQuarter(lon, lat) 
FROM [table_name] 

而且,無論是這樣的:

SELECT * 
FROM [table_name] 
WHERE getQuarter(lon,lat) = 'NE' 

回答

2

您最好在較新的標準SQL中定義您的UDF,而不是在您有一些限制的遺留SQL中定義您的UDF。

https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions

標準SQL,你可以這樣做:

SELECT location_title, getQuarter(lon, lat) 
FROM `table_name` 

這在傳統的SQL你可以欺騙,通過將來自UDF的location_title內唯一。

此外,在標準SQL可以

SELECT getQuarter(lon,lat) as q 
FROM `table_name` 
WHERE q = 'NE'