2016-10-05 6 views
2

私はuuidとユーザのためのいくつかの他の値を含むテーブルを持っています。選択時に大きなクエリUDFを使用する

また、私はMD5とCRC32値に基づいて、与えられたUUIDによってUSER_GROUP計算BQに次のUDFの機能を持っている:

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); 

だから、私のような何かをする必要があり、ユーザーの値を抽出するために:

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

私は別のテーブルのカップルでのUUIDのための同じUSER_GROUPを抽出したいと私はそれを使用するたびに「get_group」関数を定義したくないので、これは、非常に有用ではありません。また、テーブルのすべてのフィールドが必要な場合は、元のテーブルで結果をジョインするか、UDFでテーブルスキーマをハードコードする必要があります。

Big Queryの組み込み関数と同様のUDFを使用する便利な方法はありますか?たとえば:

SELECT 
    uuid, 
    get_group(uuid) 
FROM 
    [ANY_TABLE_WITH_UUID_FIELD] 

答えて

2

私は、BigQuery Standard SQL(Enabling Standard SQLを参照)で導入されたScalar User-Defined Functionsを使用することをお勧めします。

これは、あなたが探している複合性の程度を提供します
Including external librariesの機能に注意してください。それはあなたのインラインコードを最小限にする/読み取り可能な/などを維持しながら、あなたの重いコードを外部コードライブラリとして参照することができます。

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

それはstandard SQLを使用して、フィルタのこの種を表現するためにはるかに簡単です。 user-defined function referenceも参照してください。

このクエリをBigQuery UIで実行するには、「Show Options」の下の「Use Legacy SQL」のチェックを外します。

関連する問題