Как выполнять запросы к набору параметров в BigQuery - PullRequest
0 голосов
/ 07 ноября 2019

Я ищу способ выполнить параметризованный запрос к ряду параметров в Google BigQuery параллельно, возможно ли это?

Например, я ищу что-то, что может выполнить что-то вроде приведенного ниже запроса:

WITH generic_query AS (
    SELECT EXTRACT(DATE FROM start_date) as date
         , COUNT(0) as total
      FROM multi_tennant_visit_table
     WHERE start_date BETWEEN @startDate AND @endDate
       AND company_id = @companyId
)

Против фиксированных @startDate и @endDate, но некоторого вида массива @companyId значений, и возвращают данные в виде структурированного ответа в следующем (JSON) формате:

[
  {
    "company_id": "1",
    "data": [
      {
        "date": "2019-01-01",
        "total": "1431"
      },
      {
        "date": "2019-01-02",
        "total": "1876"
      }
    ]
  },
  {
    "company_id": "2",
    "data": [
      {
        "date": "2019-01-01",
        "total": "1431"
      },
      {
        "date": "2019-01-02",
        "total": "1876"
      }
    ]
  }
]

Однако это очень упрощенно, поскольку company_id является иерархическим, поскольку посещение таблицы может быть связано с компанией и ее материнской компанией, а также с компаниями-материнскими компаниями и т. Д., Которые все обрабатываются вструктура уровней здесь не показана.

Кроме того, я хотел бы выполнить около 20 запросов таким образом, некоторые из них просты и могут быть переписаны для группирования по company_id и ARRAY_AGG() и * 1018. * используется в конечном итоге с форматом ответа, который я ищу, но некоторые просто не могут, поскольку они используют @companyId в паре вложенных подзапросов, и мне нужно mainвозможность объяснения заинтересованным сторонам, т. е. это выполняет запрос, который мы имеем во всех областях, вот результаты.

Есть ли способ сделать это в большом запросе (в идеале, как один запрос), как я смотрюТысячи @company_id значений и пара баз данных в ГБ / день, поэтому не нужно, чтобы расходы пошли по спирали.

Большое спасибо, если есть какие-либо дополнительные разъяснения, не стесняйтесь спрашивать

Обновление:

Я пытался преобразовать подзапрос в функцию, которая принимает company в качестве переменной, но получаю следующую ошибку:

Коррелированные подзапросы, которые ссылаются на другие таблицы, не являютсяподдерживается, если они не могут быть декоррелированы, например, путем преобразования их в эффективное JOIN.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Несмотря на то, что подход Composer, упомянутый ранее, является одним из вариантов, вы должны рассмотреть, является ли он экономически эффективным, Composer использует много ресурсов, которые могут быть дорогостоящими.

Вы можете попробовать использовать функцию для извлечения параметроввашего вложенного файла JSON , а затем с помощью параметризованных запросов укажите эти параметры для вашего запроса.

0 голосов
/ 08 ноября 2019

Cloud Composer (Apache Airflow) используется для реализации таких сценариев использования. Вы можете взглянуть на airflow.contrib.operators.bigquery_operator. Ниже приведен пример использования этого оператора: -

from airflow.contrib.operators import bigquery_operator
    # Query recent StackOverflow questions.
    bq_recent_questions_query = bigquery_operator.BigQueryOperator(
        task_id='bq_recent_questions_query',
        bql="""
        SELECT owner_display_name, title, view_count
        FROM `bigquery-public-data.stackoverflow.posts_questions`
        WHERE creation_date < CAST('{max_date}' AS TIMESTAMP)
            AND creation_date >= CAST('{min_date}' AS TIMESTAMP)
        ORDER BY view_count DESC
        LIMIT 100
        """.format(max_date=max_query_date, min_date=min_query_date),
        use_legacy_sql=False,
        destination_dataset_table=bq_recent_questions_table_id)

Полный пример кода можно найти здесь [1]

1 - https://github.com/GoogleCloudPlatform/python-docs-samples/blob/f89ac82ea18a08398cc54762c638c686c6f938fa/composer/workflows/bq_notify.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...