sql_scripts/remote_inference/structured_table_inference_loop_generic.sql (83 lines of code) (raw):

-- *** Please fill in this section *** -- Please note that the following script needs to be filled in and will not run in the given state. -- The name of the source table DECLARE source_table DEFAULT /* source table name */; -- The name of the target table DECLARE target_table DEFAULT /* target table name */; -- The unique key columns DECLARE key_columns DEFAULT ARRAY[/* key columns */]; -- The name of the ML model to use for the ML operation DECLARE ml_model DEFAULT /* ml model name */; -- The name of the ML function to use for the ML operation DECLARE ml_function DEFAULT /* ml function name */; -- The ML query to use for the ML operation, requires the unique key DECLARE ml_query DEFAULT FORMAT( "SELECT %s, text AS content FROM `%s`", ARRAY_TO_STRING(key_columns, ','), source_table); -- The ML options to use for the ML operation DECLARE ml_options DEFAULT /* ml function options */; -- Name of the status column as output by the above ML operation DECLARE ml_status_col_name DEFAULT /* status column name */; -- The filter condition for accepting the ML result into the target table DECLARE accept_filter DEFAULT ml_status_col_name || " NOT LIKE 'A retryable error occurred:%'"; -- The number of rows to process per each query DECLARE batch_size DEFAULT 10000; -- The number of seconds elapsed to have this script terminated DECLARE termination_time_secs DEFAULT(23 * 60 * 60); -- *** End of section *** -- Create the target table first if it does not exist EXECUTE IMMEDIATE FORMAT( """ CREATE TABLE IF NOT EXISTS `%s` AS (SELECT * FROM %s (MODEL `%s`, (SELECT * FROM (%s) LIMIT %d), %s) WHERE %s)""", target_table, ml_function, ml_model, ml_query, batch_size, ml_options, accept_filter); -- Iteratively populate the target table BEGIN DECLARE cols_assignment STRING; DECLARE key_cols_filter DEFAULT( SELECT STRING_AGG("S." || key || " = T." || key, " AND ") FROM UNNEST(key_columns) AS key ); EXECUTE IMMEDIATE FORMAT( """ SELECT STRING_AGG(column_name || ' = S.' || column_name, ', ') FROM `%s.INFORMATION_SCHEMA.COLUMNS` WHERE table_name = '%s'""", LEFT(target_table, INSTR(target_table, ".", -1) - 1), SUBSTR(target_table, INSTR(target_table, ".", -1) + 1)) INTO cols_assignment; REPEAT EXECUTE IMMEDIATE FORMAT( """ MERGE `%s` T USING (SELECT * FROM %s (MODEL `%s`, (SELECT * FROM (%s) AS S WHERE NOT EXISTS (SELECT * FROM %s AS T WHERE %s) LIMIT %d), %s) WHERE %s) S ON %s WHEN NOT MATCHED THEN INSERT ROW WHEN MATCHED THEN UPDATE SET %s """, target_table, ml_function, ml_model, ml_query, target_table, key_cols_filter, batch_size, ml_options, accept_filter, key_cols_filter, cols_assignment); UNTIL(SELECT @@row_count) = 0 OR TIMESTAMP_DIFF(CURRENT_TIMESTAMP(), @@script.creation_time, SECOND) >= termination_time_secs END REPEAT; END;