web-dev-qa-db-ja.com

BigQueryでpython関数を実行する

BigQueryでpython関数を実行することは可能ですか?

CはWebAssemblyにコンパイルしてBQで実行できるようです このブログ投稿はFelipeから

そしてもちろんPythonはcythonや他のツールを使用してCまたはC++にコンパイルできます(またはそれをjavascriptに変換することもできます)。だから私の質問は、誰かが= python関数。そうであれば、それを行うために使用しているフローは何ですか?

ここで可能なオプションは次のとおりです。

  • pythonを実行するJavaScriptに「変換」します。
  • pythonをcまたはcppにコンパイルし、それをwasmにコンパイルします

以下は、使用する入力例です。

(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クエリで使用します。

25
David542

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コード

2
Kais Tounsi