使用 Pub/Sub 将 .csv 文件流式传输到云存储

Streaming .csv files into Cloud Storage using Pub/Sub

一般问题,如果有人能尽可能地指出我正确的方法,使用 [=30 将传入的流式 .csv 文件大规模导入 BigQuery(使用数据流应用一些转换)的最佳方法是什么=] ?.. 因为我想使用 pub/sub 来处理传入的 .csv 文件的许多多个大型原始流

例如我想到的做法是:

1.incoming raw.csv file > 2. pub/sub > 3. cloud storage > 4. cloud Function(触发dataflow)> 5. DataFlow(to转换)> 5.BigQuery

让我知道这种方法是否有任何问题或更好的替代方法?

如果这是一个好方法,我如何让 pub/sub 获取 .csv 文件/我该如何构造它?

谢谢

有几种不同的方法可以解决这个问题,但是您的大部分用例都可以使用 Google 提供的数据流 templates 来解决。使用模板时,可以在 JavaScript UDF 中完成灯光变换。这使您无需维护整个管道,而只需编写传入数据所需的转换。

如果您接受许多文件作为流输入到云端 Pub/Sub,请记住云端 Pub/Sub 无法保证顺序,因此来自不同文件的记录可能会混在一起输出。如果您希望按原样捕获整个文件,直接上传到 GCS 将是更好的方法。

使用提供的模板 Cloud Pub/Sub to BigQuery or GCS to BigQuery,您可以利用简单的 UDF 将数据从 CSV 格式转换为与 BigQuery 输出 table 架构匹配的 JSON 格式。

例如,如果您有如下 CSV 记录:

transactionDate,product,retailPrice,cost,paymentType
2018-01-08,Product1,99.99,79.99,Visa

您可以编写一个 UDF 来将该数据转换为您的输出架构:

function transform(line) {
  var values = line.split(',');

  // Construct output and add transformations
  var obj = new Object();
  obj.transactionDate = values[0];
  obj.product = values[1];
  obj.retailPrice = values[2];
  obj.cost = values[3];
  obj.marginPct = (obj.retailPrice - obj.cost) / obj.retailPrice;
  obj.paymentType = values[4];
  var jsonString = JSON.stringify(obj);

  return jsonString;
}