如何使用snowflake过程将javascript数组插入到表中?

h4cxqtbf  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(294)

嗨,我对snowflake还比较陌生,我正在尝试使用存储过程将2d数组插入snowflake中的表中。
数组看起来像这样[[name,last,age],[name,last,age]…],有几千个项目。
我试着在循环中使用insert,但它需要很长时间。我需要一个更快的方法来插入数据。你知道怎么做吗?

ivqmmu1c

ivqmmu1c1#

您可以尝试将多个行批处理为一个单独的行 INSERT 声明。
下面的javascript代码片段演示了一种方法,即通过在成片的行上生成一系列绑定参数来实现这一点。我还没有测试它运行,您可能需要作出调整时,适合它到您现有的程序。

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的存储过程使用一种熟悉的命令式编程语言似乎很有吸引力,但它们不是为数据加载或数据转换而设计的,并且当以这种方式使用时,不能扩展到使用仓库大小。

相关问题