我正在尝试使用GCP数据流作业处理6GB CSV文件(GZ中750 MB)。我使用的是machineType作为n1-standard-4,它是15GB RAM大小,带有4vCPU' s。
我的数据流代码
PCollection<TableRow> tableRow = lines.apply("ToTableRow", ParDo.of(new
StringToRowConverter()));
static class StringToRowConverter extends DoFn<String, TableRow> {
private static final long serialVersionUID = 1L;
@ProcessElement
public void processElement(ProcessContext c) {
String inputLine = c.element();
String[] split = inputLine.split(",");
TableRow output = new TableRow();
c.output(new TableRow().set("id", split[0]).set("apppackage", split[1]));
}
}
我的查询是如果在这么长时间内只处理6GB文件,我该如何处理400GB的压缩文件?
我是否可以优化此过程,以便能够将此数据插入我的BQ。
答案 0 :(得分:1)
CSV中的6GB 数据不多。 CSV只是存储数值数据的一种非常低效的方式,对于类似字符串的数据,它仍然会带来很大的开销,很难解析,也不可能在静止时寻找特定的位置(需要先解析)。因此,我们可以非常乐观地认为,这实际上可以实现,数据明智。这是一个导入问题。
不要滚动自己的解析器。例如:在文本中包含,
的字段呢?有足够的CSV解析器。
你说你想把这些数据放到你的BigQuery中 - 所以去谷歌的方式并遵循:
https://cloud.google.com/bigquery/docs/loading-data-local#bigquery-import-file-java
因为bigquery已经附带了它自己的支持CSV的Builder。