Я использовал bigquery
для пакетирования insert
данных из моего python
приложения. Столы были partitioned
во время приема пищи. Разница, которую я увидел, заключалась в том, что введенные мной данные появятся в течение query
через 1,5 часа после приема.
Позже я изменил schema
на столбец timestamp
На этот раз я мог query
данные сразу после приема.
Почему существует разница в поведение между _PARTITIONTIME
псевдостолбцом и timestamp
столбцом в таблице schema
?
PYTHON КОД ДЛЯ ПОЛУЧЕНИЯ:
Это упрощенная версия кода:
bigquery_client = bigquery.Client()
TABLE_REF = bigquery_client.dataset('DATASET_ID').table('TABLE_ID')
TABLE = bigquery_client.get_table(TABLE_REF)
def ingest_to_bq(data: LIST[LIST]):
bigquery_client.insert_rows(TABLE, data)
Схема таблицы:
[
{
"name": "epoch_ms",
"type": "INTEGER",
"mode": "REQUIRED"
},
{
"name": "application_id",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "ack_id",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "data",
"type": "STRING",
"mode": "REQUIRED"
}
]
Создана таблица из интерфейса BIGQUERY и распределена во время приема.
Запрос:
Я запрашиваю снова, используя интерфейс BIGQUERY.
SELECT data from <DATASET_ID>.<TABLE_ID> WHERE _PARTITIONTIME="2020-03-30"
Приведенный выше запрос не отображает результаты, полученные, скажем, полчаса назад. Для получения результатов требуется примерно 1,5 часа после приема.
НОВАЯ СХЕМА:
[
{
"name": "send_timestamp",
"type": "TIMESTAMP",
"mode": "REQUIRED"
},
{
"name": "application_id",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "ack_id",
"type": "STRING",
"mode": "REQUIRED"
},
{
"name": "data",
"type": "STRING",
"mode": "REQUIRED"
}
]
ЗАПРОС НА НОВУЮ СХЕМУ:
SELECT data from <DATASET_ID>.<TABLE_ID> WHERE send_timestamp>="2020-03-30 00:00:00" and send_timestamp<="2020-03-30 23:59:59"
Этот запрос возвращает результат сразу после приема. Мне не нужно ждать.