使用数据流作业处理大型CSV

时间:2018-05-11 06:13:09

标签: java google-cloud-platform google-bigquery google-cloud-dataflow

我正在尝试使用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]));
         }
}
  1. 我的工作自最近2小时开始运行,但仍未处理。
  2. 一旦我手动将这个大文件分成小部分,它就能正常工作。
  3. 我必须处理400GB的压缩文件以放入bigquery.All压缩文件在GCP存储中。
  4. 我的查询是如果在这么长时间内只处理6GB文件,我该如何处理400GB的压缩文件?

    我是否可以优化此过程,以便能够将此数据插入我的BQ。

1 个答案:

答案 0 :(得分:1)

CSV中的6GB 数据不多。 CSV只是存储数值数据的一种非常低效的方式,对于类似字符串的数据,它仍然会带来很大的开销,很难解析,也不可能在静止时寻找特定的位置(需要先解析)。因此,我们可以非常乐观地认为,这实际上可以实现,数据明智。这是一个导入问题。

不要滚动自己的解析器。例如:在文本中包含,的字段呢?有足够的CSV解析器。

你说你想把这些数据放到你的BigQuery中 - 所以去谷歌的方式并遵循:

https://cloud.google.com/bigquery/docs/loading-data-local#bigquery-import-file-java

因为bigquery已经附带了它自己的支持CSV的Builder。