API хранилища BigQuery не может читать из временной таблицы, созданной по заказу (ORDER BY) - PullRequest
0 голосов
/ 18 мая 2019

Google BigQuery Storage API может читать из временных таблиц , созданных из базовых запросов, включающих только SELECT, FROM и WHERE.

Я вижу, что при использовании оператора ORDER BY для получения упорядоченного набора строк создаваемая временная таблица не читается из API хранилища BigQuery.

Естьпосмотрите на пример кода ниже:

Давайте возьмем этот запрос:

sql = """SELECT name FROM `bigquery-public-data.usa_names.usa_1910_current` LIMIT 1000"""

Если вы запустите его с этим кодом Python API BigQuery:

bq_client = bigquery.Client("myproject") ## << Change to your project

query_job = bq_client.query(
    sql,
    location='US')  

project_id = query_job.destination.project
dataset_id = query_job.destination.dataset_id
table_id = query_job.destination.table_id

print("Destination table: " + project_id + "." + dataset_id + "." + table_id)

...затем вы получаете таблицу назначения.

Отсюда вы можете передать эту таблицу назначения в API хранилища BigQuery для получения результатов с помощью RPC:


client = bigquery_storage_v1beta1.BigQueryStorageClient()

table_ref = bigquery_storage_v1beta1.types.TableReference()
table_ref.project_id = project_id
table_ref.dataset_id = dataset_id
table_ref.table_id = table_id

read_options = bigquery_storage_v1beta1.types.TableReadOptions()
read_options.selected_fields.append("name")

parent = "projects/{}".format(project_id)
session = client.create_read_session(
    table_ref, parent, table_modifiers=modifiers, read_options=read_options
)  # API request.

reader = client.read_rows(
    bigquery_storage_v1beta1.types.StreamPosition(stream=session.streams[0])
)

rows = reader.rows(session)

Это работает нормально.

Теперь измените запрос в sql= <yourquery> на

sql = """SELECT name FROM `bigquery-public-data.usa_names.usa_1910_current` ORDER BY name ASC LIMIT 1000"""

, и вы получите следующую ошибку из части кода BigQuery Storage API:

Table 'myproject:mydataset.temptable' has a storage format that is not supported.

Это означает, что оператор ORDER BY в запросе добавил некоторую сложность, которая сделала временную таблицу нечитаемой для API хранилища.

Вопрос: 1) Любые мысли о том, как решить эту проблему, илидействительно ли это ограничение API хранилища при эта точка?2) Если ORDER BY создает проблему, какова полная степень запросов, которые создают нечитаемые временные таблицы для API хранилища?

...