【问题标题】:Processing large CSV's using dataflow jobs使用数据流作业处理大型 CSV
【发布时间】:2018-10-21 12:02:35
【问题描述】:

我正在尝试使用 GCP 数据流作业处理 6GB CSV 文件(在 GZ 中为 750 MB)。我使用 machineType 作为 n1-standard-4,它是 15GB RAM 大小和 4vCPU。

我的数据流代码

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。所有压缩文件都在 GCP 存储中。

我的问题是如果在这么长时间内只处理 6GB 文件,我该如何处理 400GB 的压缩文件?

有什么方法可以优化这个过程,以便我能够在我的 BQ 中插入这些数据。

【问题讨论】:

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


    【解决方案1】:

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

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

    您说您希望将这些数据输入您的 BigQuery - 所以按照谷歌的方式并遵循:

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

    因为 bigquery 已经自带支持 CSV 的 Builder。

    【讨论】:

    • 这就是我的 CSV 文件的数据 "1","com.something",myfile,"7.16.0.507","1","12/1/2016 0:00"," 9ab436f4796b344","a","b"。另一件事是我必须只从 CSV 中提取处理过的数据,而不是所有字段,所以我使用了 pCollection 数据流 API。建议对当前代码进行任何修改吗?您建议如何解析此文件?
    • 我在回答中回答了这个问题:不要自己解析,使用谷歌的 csv 构建器,然后过滤读取的数据。或者至少使用另一个被广泛使用且不是您自己编写的解析器。
    • 您能否建议通过更改上述代码来使用已经可用的解析器?
    • 是的。阅读我的答案。通过用 Google 的解析器替换您自己的解析器来更改代码。故事结束。
    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多