2017-03-20 8 views
-1

Ich muss ein Skript in Python schreiben, mit dem ich eine Abfrage für alle Spalten der Tabelle auf BigQuery hochgeladen ausführen. Ich verstehe, dass ich einzelne Spalten nach ihren Namen auswählen und sie wie folgt verarbeiten kann: SELECT DISTINCT column_name FROM table_name und dann eine UDF in Javascript schreiben, um meine Verarbeitung zu tun.Übergeben jeder Spalte einer Tabelle an eine UDF

Aber meine Anforderung ist es, alle Spaltennamen des Schemas zu erhalten (als eine Liste annehmen) und dann nacheinander die Elemente der Liste in der SELECT-Anweisung übergeben, wie die Liste der Spaltennamen ist l = [ col1, col2, col3 ...] ich mag wie etwas tun:

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

so, dass ich nicht in meinem Code der Spaltennamen des Schemas, zu hart Code benötigen. Wie kann ich diese BigQuery mit Standard-SQL tun? oder ist es nicht möglich, und ich muss meine gesamte Datenmenge in Javascript UDF übergeben und dann alle meine Verarbeitung dort tun?

+0

Versuchen Sie, die benutzerdefinierte Funktion für jede Spalte separat anzuwenden? Oder nimmt die UDF eine Teilmenge der Spalten? Ich verstehe die Form der Abfrage, die Sie erstellen möchten, nicht ganz. –

+0

Ich muss jede Spalte einzeln an die UDF übergeben –

Antwort

0

Es gibt derzeit keine Möglichkeit, eine benutzerdefinierte Funktion auf jede Spalte in einer Tabelle separat anzuwenden, ohne sie alle aufzuzählen. Eine Idee besteht darin, stattdessen eine zeilenbasierte Verarbeitung durchzuführen, wobei jedoch die Spaltennamen und -typen als Teil der Funktionsdefinition aufgelistet werden müssen. Zum Beispiel:

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

Dies wäre einfacher, wenn BigQuery Funktionen Templat unterstützt, die Sie star on the issue tracker können Sie sich registrieren.

Verwandte Themen