问题描述
我想使用bq脚本编写过程来获取A行,使用表B的架构转换其列值,然后将其插入到B中。
例如:在表A和B中,我有'score'列,它是A中的字符串,而B中的NUMERIC,我的目标是从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;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)