BigQueryでpython関数を実行することは可能ですか?
CはWebAssemblyにコンパイルしてBQで実行できるようです このブログ投稿はFelipeから 。
そしてもちろんPythonはcythonや他のツールを使用してCまたはC++にコンパイルできます(またはそれをjavascriptに変換することもできます)。だから私の質問は、誰かが= python関数。そうであれば、それを行うために使用しているフローは何ですか?
ここで可能なオプションは次のとおりです。
以下は、使用する入力例です。
(1)出典
id product
1 box
2 bottle
(2)Python使用する関数
def double_id(row):
return row['id'] * 2
def product_code(row):
# B3
return row['product'].upper()[0] + str(len(row['product']))
(3)期待される出力
id product double_id product_code
1 box 2 B3
2 bottle 4 B6
私はJavaScriptを使用して上記を書き換えるだけではなく(おそらくこれを行う最も簡単な方法でしょう)、存在するものがある場合は、より一般的な解決策を探しています-私が取ることができる場所python(標準ライブラリ)関数を使用して、BigQueryクエリで使用します。
Python 3 Apache Beam + BigQuery次に、BigQueryから読み取り、BigQueryに書き込むための主要なBeamコードを示します。
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')
)
基本的に、BigQueryテーブルでクエリを実行し、Pythonメソッドcompute_fitを実行して、出力をBigQueryテーブルに書き込みます。これは私のcompute_fitメソッドです。ご覧のとおり、これは単純です。 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
Dataflowワーカーにインストールする必要があるPythonパッケージをrequirements.txtで必ず指定してください:
%%writefile requirements.txt
numpy
scipy
楽しい!詳細については、このドキュメントを参照してください BigQueryテーブルでの実行方法Pythonコード