2017-03-20 28 views
-1

我需要在Python中編寫一個腳本,使用它我可以在bigquery上上傳的表的所有列上運行查詢。 據我所知,我可以按他們的名字選擇單個列,並像下面這樣處理它們: SELECT DISTINCT column_name FROM table_name 然後在javascript中編寫一個UDF來完成我的處理。將表的每一列傳遞給UDF

但是,我的要求是獲取模式的所有列名稱(假設爲列表),然後逐個傳遞列表中的元素,如假設列名稱列表是l = [ COL1,COL2,COL3 ...] 我想要做的事,如:

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

,這樣我就不需要硬編碼模式的列名在我的代碼。 如何使用標準的sql來做這個bigquery? 或者是不可能的,我需要將我的整個數據集傳遞給JavaScript UDF,然後在那裏處理所有的數據?

+0

您是否嘗試將UDF分別應用於每個列?或者,UDF是否需要一些列的子集?我不太瞭解您試圖製作的查詢的形狀。 –

+0

我需要一次將每列傳遞給UDF –

回答

0

當前沒有辦法將用戶定義的函數單獨應用於表中的每個列,而無需枚舉所有這些函數。一種想法是改爲進行基於行的處理,但仍然需要列出列名和類型作爲函數定義的一部分。例如:

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

如果支持的的BigQuery模板功能,您可以star on the issue tracker註冊你的興趣這會更簡單。