2017-03-20 1 views
-1

私はbigqueryにアップロードされたテーブルのすべての列に対してクエリを実行するためにPythonでスクリプトを書く必要があります。 私は個々の列を名前で選択して処理できることを理解しています。 SELECT DISTINCT column_name FROM table_name そして、処理を行うためにUDFをjavascriptで記述します。テーブルの各列をUDFに渡す

しかし、私の要件は、(リストと仮定して)スキーマのすべての列名を取得し、列名のリストがl =私は自分のコードにハードコードにスキーマの列名を必要としないように

for i in range(0,len(l): 
    SELECT DISTINCT l[i] from table_name 

:COL1、COL2、COL3 ...] は、私のような何かをしたいです。 標準SQLを使用してこのbigqueryを実行するにはどうすればよいですか? それは不可能で、私はJavaScriptのUDFに私の全データセットを渡し、そこに私のすべての処理を行う必要がありますか?

+0

UDFを各列に個別に適用しようとしていますか?あるいは、UDFは列のサブセットを取っていますか?私はあなたが作成しようとしているクエリの形をよく理解していません。 –

+0

各列を一度に1つずつUDFに渡す必要があります –

答えて

0

現在、テーブルの各列にユーザー定義関数を列挙せずに個別に適用する方法はありません。 1つの考え方は、代わりに行ベースの処理を行うことですが、それでも列名と型を関数定義の一部としてリストする必要があります。たとえば:BigQueryのは、あなたの興味を登録するstar on the issue trackerできる機能を、テンプレートサポートされている場合

#standardSQL 
CREATE TEMP FUNCTION ProcessRow(t STRUCT<x FLOAT64, y STRING, z BOOL>) 
RETURNS STRUCT<x FLOAT64, y STRING, z BOOL> LANGUAGE js AS """ 
    function ProcessColumn(x) { 
    // (Some processing here) 
    return x; 
    } 

    var new_t = new Object(); 
    for (var property in t) { 
    if (t.hasOwnProperty(property)) { 
     new_t[property] = ProcessColumn(t[property]); 
    } 
    } 
    return new_t; 
"""; 

WITH YourTable AS (
    SELECT 1 AS x, 'foo' AS y, true AS z 
) 
SELECT ProcessRow(t).* 
FROM YourTable t; 

これは単純になります。

関連する問題