2017-05-10 2 views
0

BigQueryテーブルに対して、UDFを呼び出すSQL文を実行しようとしています。このステートメントはPythonスクリプト内で実行され、呼び出しはBigQuery APIを介して行われます。UDFを呼び出すPythonスクリプトを使用してBigQuery APIを使用する方法

UDFなしで単純なSQL文を実行すると、正常に動作します。しかし、UDFスクリプト(ローカルまたはGCSバケットに格納)を使用しようとすると、同じエラーが発生します。 私は私の地元のターミナル(私はPythonのランチャー経由でスクリプトを実行する)に乗る何この:

Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/googleapiclient/http.py", line 840, in execute raise HttpError(resp, content, uri=self.uri) googleapiclient.errors.HttpError: https://www.googleapis.com/bigquery/v2/projects/[projectId]/queries?alt=json returned "Required parameter is missing">

そして、これが私のPythonスクリプトです:

credentials = SignedJwtAssertionCredentials(
SERVICE_ACCOUNT_EMAIL, 
key, 
scope='https://www.googleapis.com/auth/bigquery') 

aservice = build('bigquery','v2',credentials=credentials) 
query_requestb = aservice.jobs() 

query_data = { 
    'configuration': { 
     'query': { 
      'userDefinedFunctionResources': [ 
       { 
        'resourceUri': 'gs://[bucketName]/[fileName].js' 
       } 
      ], 
      'query': sql 
     } 
    }, 
    'timeoutMs': 100000 
} 

query_response = query_requestb.query(projectId=PROJECT_NUMBER,body=query_data).execute(num_retries=0) 

「パラメータが欠落している」またはどのように何すべてのアイデア私はこれを実行することができますか?

答えて

2

userDefinedFunctionResourcesを指定する代わりに'query'の本文にCREATE TEMP FUNCTIONを使用し、OPTIONS句の一部として参照されているライブラリを使用してください。これにはstandard SQLを使用する必要があります。また、user-defined functionsのドキュメントを参照することもできます。あなたのクエリは次のようになります:

#standardSQL 
CREATE TEMP FUNCTION MyJsFunction(x FLOAT64) RETURNS FLOAT64 LANGUAGE js AS """ 
    return my_js_function(x); 
""" 
OPTIONS (library='gs://[bucketName]/[fileName].js'); 

SELECT MyJsFunction(x) 
FROM MyTable; 
+0

クイックレスポンスElliottに感謝します。 '標準SQL 'を使って動作し、' OPTIONS'節を介して2つの別々のUDFファイルで自分の関数を呼び出すことができました。 JS関数のIF文で大文字と小文字を区別して(もし 'legacy SQL'でUDFを使うのとは逆に)' if 'を大文字小文字にしなければならないことに注意してください。この解決策は機能します。しかし、「レガシーSQL」でそれをどのように使用できるかを理解したいと思っています。 – kekchoze

0

私が実行したいクエリは、私は通常のためのUDFを使用するチャネルを販売して、トラフィックと売上を分類しました。これはstandard SQLを使用して実行したクエリです。このクエリは、私は、変数sqlで読み込み、保存ファイルに格納されます。

Pythonスクリプトで
CREATE TEMPORARY FUNCTION 
    mktchannels(source STRING, 
    medium STRING, 
    campaign STRING) 
    RETURNS STRING 
    LANGUAGE js AS """ 
return channelGrouping(source,medium,campaign) // where channelGrouping is the function in my channelgrouping.js file which contains the attribution rules 
    """ OPTIONS (library=["gs://[bucket]/[path]/regex.js", 
    "gs://[bucket]/[path]/channelgrouping.js"]); 
WITH 
    traffic AS (// select fields from the BigQuery table 
    SELECT 
    device.deviceCategory AS device, 
    trafficSource.source AS source, 
    trafficSource.medium AS medium, 
    trafficSource.campaign AS campaign, 
    SUM(totals.visits) AS sessions, 
    SUM(totals.transactionRevenue)/1e6 as revenue, 
    SUM(totals.transactions) as transactions 
    FROM 
    `[datasetId].[table]` 
    GROUP BY 
    device, 
    source, 
    medium, 
    campaign) 
SELECT 
    mktchannels(source, 
    medium, 
    campaign) AS channel, // call the temp function set above 
    device, 
    SUM(sessions) AS sessions, 
    SUM(transactions) as transactions, 
    ROUND(SUM(revenue),2) as revenue 
FROM 
    traffic 
GROUP BY 
    device, 
    channel 
ORDER BY 
    channel, 
    device; 

そして:

fd = file('myquery.sql', 'r') 
sql = fd.read() 
fd.close() 

query_data = { 
    'query': sql, 
    'maximumBillingTier': 10, 
    'useLegacySql': False, 
    'timeoutMs': 300000 
} 

希望これは、将来的に誰にも役立ちます!

関連する問題