Node.js BigQuery在单个作业中更新多行

Node.js BigQuery在单个作业中更新多行,node.js,google-bigquery,gcloud,Node.js,Google Bigquery,Gcloud,我有两个数组,一个用于我要更新的值,另一个用于where语句。 这是用户名列表: [ '4feathersandfur', '4flyman', '4iisx', '4lergico_', '4mygal', '4mygal', '4mygal', '4mygal', '4mygal', '4mygal', '4mygal',

我有两个数组,一个用于我要更新的值,另一个用于where语句。 这是用户名列表:

[
  '4feathersandfur',       '4flyman',
  '4iisx',                 '4lergico_',
  '4mygal',                '4mygal',
  '4mygal',                '4mygal',
  '4mygal',                '4mygal',
  '4mygal',                '4ringzryan',
  '4summeror4ever',        '5.by',
  '5.by',                  '5.by',
  '5.by',                  '5.by',
  '5.vt',                  '5.vt',
  '5.vt',                  '5.vt',
  '5.vt',                  '5.vt',
  '5.vt',                  '5.vt',
  '501_f',                 '502_nesha',
  '5050_therealvito',      '50_shades_of_dramatic',
  '50_shades_of_dramatic', '50tonsdesono_',
  '526ha',                 '5588fatima',
  '5588fatima',            '559ac',
  '55sommy55',             '55sommy55',
  '58_q8',                 '5_alsheh7i.94'
] 
这是一个新的追随者名单

[
  '1001', '1000', '1001', '1000',
  '1000', '1000', '1000', '1000',
  '1000', '1000', '1000', '1001',
  '1001', '1000', '1000', '1000',
  '1000', '1000', '1001', '1001',
  '1001', '1001', '1001', '1001',
  '1001', '1001', '1000', '1000',
  '1001', '1001', '1001', '1001',
  '1001', '1001', '1001', '1000',
  '1001', '1001', '1000', '1001'
]
我想要一个单一的作业来更新所有带有这些用户名的行,以及它们对应的跟随者的计数。是否可以在一个作业中完成这项工作

表的架构是

Field name  Type    Mode    Description
username    STRING  NULLABLE    
website STRING  NULLABLE    
description STRING  NULLABLE    
url STRING  NULLABLE    
followed_by INTEGER NULLABLE    
email   STRING  NULLABLE    
new_ig_followers_count  INTEGER NULLABLE    
updated_at  TIMESTAMP   NULLABLE    
IG_alive    BOOLEAN NULLABLE    

因为我没有办法在一份工作中做到这一点

function currentTimeStamp() {
  var dateTime = new Date().toUTCString();
  dateTime = "'" + moment(dateTime).format("YYYY-MM-DD HH:mm:ss") + "'";
  return dateTime;
}

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function query(usernameArray, followersCountArray) {
  for (let i = 0; i < usernameArray.length; i++) {
    await sleep(10000)
    console.log("usernameArray, followersCountArray", usernameArray[i], followersCountArray[i])
    const query = `UPDATE \`instagramdata.instagram.40_50_followers\`
          SET new_ig_followers_count = ${followersCountArray[i]}, updated_at = ${currentTimeStamp()}, IG_alive = true
          WHERE username = ${usernameArray[i]}`;
    const options = {
      query: query,
    };
    const [job] = await bigquery.createQueryJob(options);
    console.log(`Job ${job.id} started.`);
    const [rows] = await job.getQueryResults();
    console.log('Rows:');
    rows.forEach(row => console.log(row));
  }
}
函数currentTimeStamp(){
var dateTime=new Date().toutString();
dateTime=“”+时刻(dateTime).format(“YYYY-MM-DD HH:MM:ss”)+“;
返回日期时间;
}
功能睡眠(ms){
返回新承诺(resolve=>setTimeout(resolve,ms));
}
异步函数查询(usernameArray、followersCountArray){
for(设i=0;iconsole.log(row));
}
}

我可以使用此函数查询usernameArray中的所有用户名,从而更新行。我很乐意知道一个更新单个作业中所有行的解决方案是针对BigQuery标准SQL的

function currentTimeStamp() {
  var dateTime = new Date().toUTCString();
  dateTime = "'" + moment(dateTime).format("YYYY-MM-DD HH:mm:ss") + "'";
  return dateTime;
}

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function query(usernameArray, followersCountArray) {
  for (let i = 0; i < usernameArray.length; i++) {
    await sleep(10000)
    console.log("usernameArray, followersCountArray", usernameArray[i], followersCountArray[i])
    const query = `UPDATE \`instagramdata.instagram.40_50_followers\`
          SET new_ig_followers_count = ${followersCountArray[i]}, updated_at = ${currentTimeStamp()}, IG_alive = true
          WHERE username = ${usernameArray[i]}`;
    const options = {
      query: query,
    };
    const [job] = await bigquery.createQueryJob(options);
    console.log(`Job ${job.id} started.`);
    const [rows] = await job.getQueryResults();
    console.log('Rows:');
    rows.forEach(row => console.log(row));
  }
}
UPDATE `instagramdata.instagram.40_50_followers`
SET 
  new_ig_followers_count = followersCount, 
  updated_at = CURRENT_TIMESTAMP(), 
  IG_alive = TRUE
FROM (
  SELECT [
    '4feathersandfur',       '4flyman',
    '4iisx',                 '4lergico_',
    '4mygal',                '4mygal',
    '4mygal',                '4mygal',
    '4mygal',                '4mygal',
    '4mygal',                '4ringzryan'
  ] AS usernameArray,
  [
    '1001', '1000', '1001', '1000',
    '1000', '1000', '1000', '1000',
    '1000', '1000', '1000', '1001'
  ] AS followersCountArray
),
UNNEST(usernameArray) AS Name WITH OFFSET
JOIN UNNEST(followersCountArray) AS followersCount WITH OFFSET
USING(OFFSET)
WHERE username = Name

请澄清这与BigQuery的关系-现在是BQ表吗?表的scema和预期结果是什么。注意:BigQuery和mySql是完全不同的引擎,所以只保留您的问题所涉及的标记,并删除另一个标记是的,我想在BigQuery表中更新这个标记。预期结果是我想更新表中用户名对应的所有关注者计数列值。表的架构和输出架构不清楚-请提供表的两个架构的明确示例
字段名类型模式描述\n用户名字符串可空\n网站字符串可空\ndescription STRING NULLABLE\n url STRING NULLABLE\n后跟整数NULLABLE\n email STRING NULLABLE\n new\u ig\u followers\u count INTEGER NULLABLE\n updated\u在时间戳NULLABLE\n ig\u alive BOOLEAN NULLABLE
\n请使用所有详细信息更新您的问题-注释格式不允许以可读方式显示所有需要的信息你能给我解释一下这个问题吗?当然。上面使用这两个数组(usernameArray,followersCountArray)并取消对它们的调用-对于每个数组来说都是这样的-使用两列生成一种临时表-第一列是数组的元素,第二列(offset)是数组中该元素的位置。然后这两个表在那个位置连接起来,所以现在我们有了一个表,它有两列,分别来自两个数组(user,count)的元素,最后我们进行了更新-希望这有帮助