2016-10-05 4 views
2

Ich habe eine Tabelle, die uuid und einige andere Werte für Benutzer enthält.Verwenden von Big Query UDF während der Auswahl

Auch ich habe folgende UDF-Funktion in BQ, die von bestimmten UUID berechnet user_group, basierend auf MD5 und CRC32-Wert:

function GetGroup(uuid) {... 
} 

function getUserGroup(r, emit) { 
emit ({group: GetGroup(String(r.uuid)), uuid: r.uuid 
    }); 
} 

bigquery.defineFunction(
'get_group', 
['uuid'],  
[{'name': 'group', 'type': 'string'}, {'name': 'uuid', 'type': 'string'}], 
getUserGroup); 

Also, den Nutzwert ich wie etwas tun müssen, extrahieren:

Diese
SELECT 
    group, 
    uuid 
FROM 
    get_group(
    SELECT 
     uuid 
    FROM 
     [MY_TABLE]) 

ist nicht sehr nützlich, weil ich die gleiche user_group für uUID in paar verschiedenen Tabellen extrahieren möchte und ich möchte nicht die Funktion „get_group“ jedes Mal, ich will definieren, es zu benutzen. Wenn ich alle Felder aus der Tabelle haben möchte, muss ich außerdem das Ergebnis mit der Originaltabelle verknüpfen oder das Tabellenschema in UDF hardcodieren.

Gibt es eine bequeme Möglichkeit, UDF ähnlich wie jede andere in Big Query integrierte Funktion zu verwenden? Zum Beispiel:

SELECT 
    uuid, 
    get_group(uuid) 
FROM 
    [ANY_TABLE_WITH_UUID_FIELD] 

Antwort

2

Ich denke, die beste Option für Sie ist die Verwendung von Scalar User-Defined Functions eingeführt mit BigQuery Standard SQL (siehe Enabling Standard SQL).

Dies gibt Ihnen ein großes Maß an Kompatibilität, die Sie suchen
Achten Sie auf Including external libraries Funktion. Es ermöglicht Ihnen, Ihren schweren Code als externe Codebibliotheken zu referenzieren, während Ihr Inline-Code minimal/lesbar/usw. bleibt.

CREATE TEMP FUNCTION get_group(uuid STRING) 
    RETURNS STRING 
    LANGUAGE js AS 
""" 
    return get_group(uuid); 
""" 

OPTIONS (
    library="gs://your-bucket/path/to/your-lib.js" 
); 

SELECT 
    uuid, 
    get_group(uuid) 
FROM 
    [ANY_TABLE_WITH_UUID_FIELD] 
CREATE TEMP FUNCTION get_group(uuid STRING) 
    RETURNS STRING 
    LANGUAGE js AS 
""" 
    return get_group(uuid); 
""" 

OPTIONS (
    library="gs://your-bucket/path/to/your-lib.js" 
); 

SELECT 
    uuid, 
    get_group(uuid) 
FROM 
    [ANY_TABLE_WITH_UUID_FIELD] 
2

Es ist viel einfacher, diese Art von Filter zum Ausdruck mit standard SQL; siehe auch die user-defined function reference. Hier ein Beispiel:

CREATE TEMP FUNCTION get_group(uuid STRING) RETURNS STRING LANGUAGE js AS """ 
function get_group(uuid) { 
    // (Your code here) 
    return uuid + 'foo'; 
} 

return get_group(uuid); 
"""; 

WITH MyTable AS (
    SELECT uuid FROM UNNEST(['aaa', 'bbb', 'ccc']) AS uuid 
) 
SELECT uuid, get_group(uuid) AS `group` 
FROM MyTable; 

Um diese Abfrage in der BigQuery UI ausführen, deaktivieren Sie "Use Legacy-SQL" unter "Optionen einblenden".

Verwandte Themen