雪花和存储过程我们如何遍历保存在内部阶段的文件的行?
Snowflake and Stored procedure how can we loop over rows of a file saved in an internal stage?
我有一个雪花阶段的文件,我想遍历每一行,并将列值垂直插入 SAT
table。我启动了以下 JavaScript 存储过程:
CREATE PROCEDURE ADD_OBSERVATION_VALUES()
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
// Get number of rows
var num_rows_sql = "SELECT COUNT(*) FROM @ingest_stg/load/(file_format => 'csv_format', pattern => '.*[.]csv.gz') t";
var stmt = snowflake.createStatement( {sqlText: num_rows_sql} );
var rows_result = stmt.execute();
rows_result.next();
num_rows = rows_result.getColumnValue(1);
while(i<num_rows) {
}
$$;
在这种情况下,如何遍历文件的每一行,以便将列值作为新行逐一插入?
换句话说,假设我有 100 行。我想遍历每一行,并将其列值插入另一个 table,但垂直插入。
以下代码将演示从一个阶段读取多个列 (2),然后插入 table。
这是我的目标table:
create or replace table target_Table(
v1 varchar, v2 varchar,
v3 varchar, v4 varchar,
v5 varchar, v6 varchar);
这是文件中的数据:
select , from @gokhan;
+-------+-------+
| | |
+-------+-------+
| zozo0 | hoho0 |
| zozo1 | hoho1 |
| zozo2 | hoho2 |
+-------+-------+
因此程序将从舞台读取这些行,然后将所有这些列合并为一行并将其插入到 target_table:
CREATE PROCEDURE ADD_OBSERVATION_VALUES()
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var num_rows_sql = "SELECT , FROM @gokhan (file_format => 'csv_format', pattern => '.*[.]csv.gz') t";
var stmt = snowflake.createStatement( {sqlText: num_rows_sql} );
var rows_result = stmt.execute();
var value_array = [];
while(rows_result.next()) {
value_array.push( rows_result.getColumnValue(1) );
value_array.push( rows_result.getColumnValue(2) );
}
snowflake.createStatement( { sqlText: 'INSERT INTO target_Table VALUES (?, ?, ?, ?, ?, ?)',
binds: value_array } ).execute();
return 'OK';
$$;
在存储过程中,我读取每一行(我假设它有 2 列,然后将它们推入 JavaScript 数组(value_array)。读取所有行后,我发送这些值到 INSERT 语句。当然,在发送之前,可以做一些转换。据我所知,文件中有 3 行,我没有设置任何限制,但为了避免任何错误,您可以停止阅读读取足够数据后的文件。
这是结果:
call ADD_OBSERVATION_VALUES();
select * from target_table;
+-------+-------+-------+-------+-------+-------+
| V1 | V2 | V3 | V4 | V5 | V6 |
+-------+-------+-------+-------+-------+-------+
| zozo0 | hoho0 | zozo1 | hoho1 | zozo2 | hoho2 |
+-------+-------+-------+-------+-------+-------+
我有一个雪花阶段的文件,我想遍历每一行,并将列值垂直插入 SAT
table。我启动了以下 JavaScript 存储过程:
CREATE PROCEDURE ADD_OBSERVATION_VALUES()
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
// Get number of rows
var num_rows_sql = "SELECT COUNT(*) FROM @ingest_stg/load/(file_format => 'csv_format', pattern => '.*[.]csv.gz') t";
var stmt = snowflake.createStatement( {sqlText: num_rows_sql} );
var rows_result = stmt.execute();
rows_result.next();
num_rows = rows_result.getColumnValue(1);
while(i<num_rows) {
}
$$;
在这种情况下,如何遍历文件的每一行,以便将列值作为新行逐一插入?
换句话说,假设我有 100 行。我想遍历每一行,并将其列值插入另一个 table,但垂直插入。
以下代码将演示从一个阶段读取多个列 (2),然后插入 table。
这是我的目标table:
create or replace table target_Table(
v1 varchar, v2 varchar,
v3 varchar, v4 varchar,
v5 varchar, v6 varchar);
这是文件中的数据:
select , from @gokhan;
+-------+-------+
| | |
+-------+-------+
| zozo0 | hoho0 |
| zozo1 | hoho1 |
| zozo2 | hoho2 |
+-------+-------+
因此程序将从舞台读取这些行,然后将所有这些列合并为一行并将其插入到 target_table:
CREATE PROCEDURE ADD_OBSERVATION_VALUES()
RETURNS string
LANGUAGE JAVASCRIPT
AS
$$
var num_rows_sql = "SELECT , FROM @gokhan (file_format => 'csv_format', pattern => '.*[.]csv.gz') t";
var stmt = snowflake.createStatement( {sqlText: num_rows_sql} );
var rows_result = stmt.execute();
var value_array = [];
while(rows_result.next()) {
value_array.push( rows_result.getColumnValue(1) );
value_array.push( rows_result.getColumnValue(2) );
}
snowflake.createStatement( { sqlText: 'INSERT INTO target_Table VALUES (?, ?, ?, ?, ?, ?)',
binds: value_array } ).execute();
return 'OK';
$$;
在存储过程中,我读取每一行(我假设它有 2 列,然后将它们推入 JavaScript 数组(value_array)。读取所有行后,我发送这些值到 INSERT 语句。当然,在发送之前,可以做一些转换。据我所知,文件中有 3 行,我没有设置任何限制,但为了避免任何错误,您可以停止阅读读取足够数据后的文件。
这是结果:
call ADD_OBSERVATION_VALUES();
select * from target_table;
+-------+-------+-------+-------+-------+-------+
| V1 | V2 | V3 | V4 | V5 | V6 |
+-------+-------+-------+-------+-------+-------+
| zozo0 | hoho0 | zozo1 | hoho1 | zozo2 | hoho2 |
+-------+-------+-------+-------+-------+-------+