Скрипты Bigquery - динамическое преобразование строк перед вставкой
- У меня есть таблица A и таблица B.
- В таблице A все столбцы представляют собой строки
- В таблице B у меня те же столбцы, что и в таблице A, но с их реальным типом.
Я хотел бы использовать процесс сценария bq, чтобы получить мои строки A, преобразовать значения их столбцов, используя схему таблицы B, а затем вставить их в B.
Например: в таблицах A и B у меня есть столбец "оценка", который представляет собой строку в A и NUMERIC в B, моя цель - получить из A, преобразовать его, если возможно, в число, а затем вставить его в B. делаю это динамически, я собираю схему B, чтобы знать, что преобразовать.
Извините за мой английский, английский не мой родной язык.
BEGIN
DECLARE offset_ INT64 DEFAULT 1; -- OFFSET starts in 1 BASED on ROW NUMBER ()
DECLARE limit_ INT64 DEFAULT 500; -- Size of the chunks to be processed
DECLARE size_ INT64 DEFAULT 1000; -- Size of the data (used for the condition in the WHILE loop)
DECLARE int_keys ARRAY<STRING>;
DECLARE num_keys ARRAY<STRING>;
DECLARE bool_keys ARRAY<STRING>;
DECLARE str_keys ARRAY<STRING>;
DECLARE date_keys ARRAY<STRING>;
set int_keys = (SELECT ARRAY_AGG(column_name) FROM B_dataset.INFORMATION_SCHEMA.COLUMNS
where table_name = B and data_type = 'INT64');
set num_keys = (SELECT ARRAY_AGG(column_name) FROM B_dataset.INFORMATION_SCHEMA.COLUMNS
where table_name = B and data_type = 'NUMERIC');
set bool_keys = (SELECT ARRAY_AGG(column_name) FROM B_dataset.INFORMATION_SCHEMA.COLUMNS
where table_name = B and data_type = 'BOOL');
set str_keys = (SELECT ARRAY_AGG(column_name) FROM B_dataset.INFORMATION_SCHEMA.COLUMNS
where table_name = B and data_type = 'STRING');
set date_keys = (SELECT ARRAY_AGG(column_name) FROM B_dataset.INFORMATION_SCHEMA.COLUMNS
where table_name = B and data_type = 'TIMESTAMP');
CREATE TEMPORARY TABLE IF NOT EXISTS stg_records AS (
SELECT *, ROW_NUMBER() OVER() row_number
FROM (select * from A_dataset.A )
);
WHILE loop
WHILE offset_ < size_ DO
INSERT INTO B_dataset.B (
#for example, here I would like to get the columns that I have to convert to integer and cast them
SELECT int_keys FROM stg_records WHERE row_number BETWEEN offset_ AND offset_ + limit_ - 1
UNION ALL
SELECT num_keys FROM stg_recordsWHERE row_number BETWEEN offset_ AND offset_ + limit_ - 1
UNION ALL
SELECT bool_keys FROM stg_recordsWHERE row_number BETWEEN offset_ AND offset_ + limit_ - 1
UNION ALL
SELECT str_keys FROM stg_records WHERE row_number BETWEEN offset_ AND offset_ + limit_ - 1
UNION ALL
SELECT date_keys FROM stg_records WHERE row_number BETWEEN offset_ AND offset_ + limit_ - 1
);
SET offset_ = offset_ + limit_;
END WHILE;
END;