簡體   English   中英

GCP Dataflow-從存儲讀取CSV文件並寫入BigQuery

[英]GCP Dataflow- read CSV file from Storage and write into BigQuery

我在存儲中有一個CSV文件,我想讀取它並將其寫入BigQuery表。 這是我的CSV文件,其中第一行是標題:

GroupName,Groupcode,GroupOwner,GroupCategoryID
System Administrators,sysadmin,13456,100
Independence High Teachers,HS Teachers,,101
John Glenn Middle Teachers,MS Teachers,13458,102
Liberty Elementary Teachers,Elem Teachers,13559,103
1st Grade Teachers,1stgrade,,104
2nd Grade Teachers,2nsgrade,13561,105
3rd Grade Teachers,3rdgrade,13562,106
Guidance Department,guidance,,107
Independence Math Teachers,HS Math,13660,108
Independence English Teachers,HS English,13661,109
John Glenn 8th Grade Teachers,8thgrade,,110
John Glenn 7th Grade Teachers,7thgrade,13452,111
Elementary Parents,Elem Parents,,112
Middle School Parents,MS Parents,18001,113
High School Parents,HS Parents,18002,114

這是我的代碼:

    public class StorgeBq {

        public static class StringToRowConverter extends DoFn<String, TableRow> {

            private String[] columnNames;

            private boolean isFirstRow = true;

            @ProcessElement
            public void processElement(ProcessContext c) {
                TableRow row = new TableRow();

                String[] parts = c.element().split(",");

                if (isFirstRow) {
                    columnNames = Arrays.copyOf(parts, parts.length);
                    isFirstRow = false;
                } else {
                    for (int i = 0; i < parts.length; i++) {
                        row.set(columnNames[i], parts[i]);
                    }
                    c.output(row);
                }
            }
        }

        public static void main(String[] args) {

            DataflowPipelineOptions options = PipelineOptionsFactory.fromArgs(args).withValidation()
                      .as(DataflowPipelineOptions.class);
                    options.setZone("europe-west1-c");
                    options.setProject("mydata-dev");
                    options.setRunner(DataflowRunner.class);
                    Pipeline p = Pipeline.create(options);

            p.apply("ReadLines", TextIO.read().from("gs://mydata3-dataflow/C2ImportGroupsSample.csv"))
            .apply("ConverToBqRow",ParDo.of(new StringToRowConverter()))
            .apply("WriteToBq", BigQueryIO.<TableRow>writeTableRows()
                    .to("mydata-dev:DF_TEST.dataflow_table")
                    .withWriteDisposition(WriteDisposition.WRITE_APPEND)
                    .withCreateDisposition(CreateDisposition.CREATE_NEVER));
            p.run().waitUntilFinish();
        }

}

存在一些問題:1)當作業開始執行時,我看到有一個名為“ DropInputs”的進程,我的代碼中尚未定義該進程! 並開始在所有任務之前運行,為什么? 在此處輸入圖片說明

2)為什么管道不以第一個任務“ ReadLines”開頭? 3)在日志文件中,我看到在任務“ WriteToBq”中它嘗試查找其中一個數據作為字段,例如“ 1st Year Teachers”不是字段,而是“ GroupName”的數據:

"message" : "JSON parsing error in row starting at position 0: No such field: 1st Grade Teachers.",

您的代碼中有幾個問題。 但是,首先,對於“ DropInputs”階段-您可以放心地忽略它。 這是錯誤報告的結果。 我仍然不明白為什么需要顯示它(它也使我們的很多用戶感到困惑),並且我很希望Googler能夠對此加以介紹。 我認為這只是混亂。

正確,現在輸入您的代碼:

  1. 您假設讀取的第一行將是您的標題。 這是一個錯誤的假設。 數據流是並行讀取的,因此標題行可以隨時到達。 而不是使用boolean標志進行檢查,而是每次在ParDo檢查string值本身,例如, if (c.element.contains("GroupName") then..
  2. 您缺少BigQuery表架構。 您需要在您的BigQuery接收器中添加withSchema(..) 這是我的一個公共管道中的一個示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM