如何使用雪花程序将JavaScript数组插入表中?

时间:2020-06-25 01:26:57

标签: sql stored-procedures snowflake-cloud-data-platform

嗨,我对雪花还很陌生,我正在尝试使用存储过程将2D数组插入雪花的表格中。

数组看起来像这样[[name,last,age],[name,last,age] ..] 有几千个项目。

我尝试通过循环使用INSERT INTO,但这花了很长时间。我需要一种更快的方法来插入数据。知道如何处理吗?

1 个答案:

答案 0 :(得分:1)

您可以尝试将许多行一起批处理成single INSERT statement

以下javascript代码段说明了通过在binding parameters上生成的chunked number of rows序列来实现此目的的一种方法。我尚未对其运行进行测试,因此将其安装到现有过程中时可能需要进行调整。

var dataArray = [[name,last,age], [name,last,age], …]

// Generates (?,?,?) if there are 3 cols per row
var row_bind = "(" + ",".join(Array(dataArray[0].length).fill("?")) + ")"

while (dataArray.length > 0) {

  // Consume upto 100 rows at a time
  var dataChunk = dataArray.splice(0, 100);

  // Generate (?,?,?),(?,?,?),[...] upto a 100 times
  var params = Array(dataChunk.length).fill(row_bind).join(",");

  // Place the bind params into the query
  var statement = "INSERT […] VALUES " + params;

  // Prepare a statement with a flat stream of row/col data sent along
  var stmt = snowflake.createStatement({
    sqlText: statement,
    binds: dataChunk.flat()
  });

  // Perform your 'stmt' logic, iterate over for the next batch...
}

注意:使用常规SQL尝试做的事是不可能的吗?调用过程实际上是单线程的,如果您要遍历SQL查询可以更好地处理的数据集,则调用过程将缺乏性能。

通过Snowflake的存储过程使用一种熟悉的命令式编程语言似乎很有吸引力,但是它们并不是为数据加载或数据转换而设计的,并且不能通过这种方式扩展使用仓库的大小。