Serait-il possible d'exécuter une fonction python dans BigQuery?
Il semble que C puisse être compilé en WebAssembly et exécuté en BQ, par cet article de blog de Felipe .
Et bien sûr Python peut être compilé en C ou C++ à l'aide de cython ou d'autres outils (ou il pourrait même être transposé en javascript). Alors ma question est: est-ce que quelqu'un a de l'expérience en exécutant a = python dans BigQuery. Si oui, quel est le flux que vous utilisez pour le faire?
Les options possibles ici sont:
Voici un exemple d'entrée pour travailler avec:
(1) Source
id product
1 box
2 bottle
(2) Python fonctions à utiliser
def double_id(row):
return row['id'] * 2
def product_code(row):
# B3
return row['product'].upper()[0] + str(len(row['product']))
(3) Sortie attendue
id product double_id product_code
1 box 2 B3
2 bottle 4 B6
Je ne cherche pas seulement à réécrire ce qui précède en utilisant javascript (ce qui serait probablement le moyen le plus simple de le faire), mais je cherche une solution plus généralisée, s'il en existe une - où je peux prendre une fonction python (bibliothèque standard) et l'utiliser dans une requête BigQuery.
Python 3 Apache Beam + BigQuery Voici le code clé de Beam à lire à partir de BigQuery et à écrire dans BigQuery:
with beam.Pipeline(RUNNER, options = opts) as p:
(p
| 'read_bq' >> beam.io.Read(beam.io.BigQuerySource(query=query, use_standard_sql=True))
| 'compute_fit' >> beam.FlatMap(compute_fit)
| 'write_bq' >> beam.io.gcp.bigquery.WriteToBigQuery(
'ch05eu.station_stats', schema='station_id:string,ag:FLOAT64,bg:FLOAT64,cg:FLOAT64')
)
Essentiellement, nous exécutons une requête sur une table BigQuery, exécutons la méthode Python compute_fit et écrivons la sortie dans une table BigQuery. Ceci est ma méthode compute_fit. Comme vous pouvez le voir, c'est tout simplement simple Python:
def compute_fit(row):
from scipy import stats
import numpy as np
durations = row['duration_array']
ag, bg, cg = stats.gamma.fit(durations)
if np.isfinite(ag) and np.isfinite(bg) and np.isfinite(cg):
result = {}
result['station_id'] = str(row['start_station_id'])
result['ag'] = ag
result['bg'] = bg
result['cg'] = cg
yield result
Assurez-vous de spécifier les packages Python que vous devez installer sur les travailleurs Dataflow dans un fichier requirements.txt:
%%writefile requirements.txt
numpy
scipy
Prendre plaisir! pour plus d'informations, vous pouvez vous référer à ce document Comment exécuter Python sur votre table BigQuery