Запуск функции Python в BigQuery - PullRequest
24 голосов
/ 01 апреля 2019

Можно ли запустить функцию Python в BigQuery?

Похоже, что C можно скомпилировать в WebAssembly и запустить в BQ, согласно этой записи в блоге от Felipe .

И, конечно, Python может быть скомпилирован в C или C ++ с использованием Cython или некоторых других инструментов (или даже может быть перенесен в javascript). Итак, у меня вопрос: есть ли у кого-нибудь опыт выполнения функции python в BigQuery? Если да, то какой поток вы используете для этого?

Возможные варианты:

  • «Превратить» питона в javascript для запуска.
  • Скомпилируйте питона в 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.

1 Ответ

1 голос
/ 23 июня 2019

Python 3 Apache Beam + BigQuery Вот ключевой код Beam для чтения из BigQuery и записи в 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')
    )

По сути, мы выполняем запрос к таблице 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

Обязательно укажите пакеты Python, которые вам нужно установить на рабочих потока данных, в файле require.txt:

%%writefile requirements.txt
numpy
scipy

Наслаждайтесь! для получения дополнительной информации вы можете обратиться к этому документу Как запустить код Python в вашей таблице BigQuery

...