Скрипты 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;

0 ответов

Другие вопросы по тегам