Решение проблемы
В общем, вы настраиваете себя на мир боли, когда пытаетесь запросить базу данных NoSQL (например, BigTable) с помощью SQL. Разложение данных — очень затратная операция в SQL, потому что вы эффективно выполняете перекрестное соединение (которое означает «многие ко многим») каждый раз, когда вызывается UNNEST, поэтому попытка сделать это более 600 раз даст вам либо тайм-аут запроса, либо огромный счет.
API BigTable будет намного эффективнее, чем SQL, поскольку он предназначен для запросов к структурам NoSQL. Распространенным шаблоном является наличие сценария, который выполняется ежедневно (например, сценарий Python в облачной функции) и использует API для получения данных за этот день, их анализа и последующего вывода в файл в облачном хранилище. Затем вы можете запрашивать эти файлы через BigQuery по мере необходимости. Ежедневный сценарий, который перебирает все столбцы ваших данных, не требуя обширных преобразований данных, обычно дешев и, безусловно, дешевле, чем попытка принудительно выполнить его через SQL.
При этом, если вы действительно настроены на использование SQL, вы можете использовать JSON-функции BigQuery для извлечения необходимых вам вложенных данных. Трудно визуализировать вашу структуру данных без демонстрационных данных, но вы можете прочитать всю строку как один столбец JSON или строку. Затем, если у вас есть предсказуемый путь для значений, которые вы хотите извлечь, вы можете использовать функцию, например JSON_EXTRACT_STRING_ARRAY, для извлечения всех этих значений в массив. Точно так же можно использовать функцию Regex. Но если вам нужно выполнить такой анализ всей таблицы, чтобы запросить ее, пакетное задание для предварительного преобразования данных все же будет намного эффективнее.
Комментариев нет:
Отправить комментарий