Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud dataflow 如何在BigQueryIO.Write之前读取和转换CSV头文件?_Google Cloud Dataflow - Fatal编程技术网

Google cloud dataflow 如何在BigQueryIO.Write之前读取和转换CSV头文件?

Google cloud dataflow 如何在BigQueryIO.Write之前读取和转换CSV头文件?,google-cloud-dataflow,Google Cloud Dataflow,我有一个csv文件,第一行包含标题。我正在阅读它并清理这些标题以符合BigQuery列的要求。但是在管道开始之前,我需要一个对模式的引用。允许BigQueryIO.Write以这种方式响应头的最佳实践是什么?目前,我的代码如下所示: //create table Table table = new Table(); // Where logically should the following line go? TableSchema customSchema = ? table.setSche

我有一个csv文件,第一行包含标题。我正在阅读它并清理这些标题以符合BigQuery列的要求。但是在管道开始之前,我需要一个对模式的引用。允许BigQueryIO.Write以这种方式响应头的最佳实践是什么?目前,我的代码如下所示:

//create table
Table table = new Table();
// Where logically should the following line go?
TableSchema customSchema = ?
table.setSchema(customSchema);
TableReference tableRef = new TableReference();
tableRef.setDatasetId("foo_dataset");
tableRef.setProjectId("bar_project");
tableRef.setTableId("baz_table");
table.setTableReference(tableRef);

Pipeline p = Pipeline.create(options);

p.apply(TextIO.Read.named("ReadCSV").from("gs://bucket/file.csv"))
  // Detect if it's header row
  .apply(ParDo.of(new ExtractHeader()))
  .apply(ParDo.of(new ToTableRow())
  .apply(BigQueryIO.Write.named("Write")
    .to(tableRef)
    // Where logically should the following line go?
    .withSchema(customSchema));
p.run();
我目前正在尝试实现两个管道,大致如下所示,但数据流中的执行顺序不可靠,因此我在BQ表不存在的地方遇到错误

PCollection readIn = p.apply(TextIO.Read.named("ReadCSV").from("gs://bucket/file.csv"))
  .apply(ParDo.of(new ExtractHeader()));
TableSchema customSchema = /* generate schema based on what I now know the headers are */
readIn.apply(ParDo.of(new ToTableRow())
  .apply(BigQueryIO.Write.named("Write")
    .to(tableRef)
    // Where logically should the following line go?
    .withSchema(customSchema));
p.run();


这个特性(动态模式)正在审查中(我正在审查)。您可以尝试一下进行中的PR,但是请注意,它的API可能会因审查而有所改变。提交PR后,我将更新此答案。

此功能(动态模式)正在审阅中(我正在审阅)。您可以尝试一下进行中的PR,但是请注意,它的API可能会因审查而有所改变。提交PR后,我会更新此答案。

谢谢@jkff,谢谢你了解我问题的要点!实际上,我的工作要求我等待2.0.0版本,但我会在Beam稳定后立即执行。同时,是否会是“数据流方式”先读取文件,去掉标题,然后将信息传递给管道?是的,我相信同时您必须首先读取文件并理解模式,然后创建一个新的管道来传递(已知的)我假设这是通过2.0.0中的
DynamicDestinations
实现的?如果是这样,万岁!是的,享受新的API:)谢谢@jkff,谢谢你了解我问题的要点!实际上,我的工作要求我等待2.0.0版本,但我会在Beam稳定后立即执行。同时,是否会是“数据流方式”先读取文件,去掉标题,然后将信息传递给管道?是的,我相信同时您必须首先读取文件并理解模式,然后创建一个新的管道来传递(已知的)我假设这是通过2.0.0中的
DynamicDestinations
实现的?如果是这样,万岁!是的,喜欢新的API:)嗨@Mitch,我能问一下你在ExtractHeader()中做什么吗?我正在尝试做同样的事情,但无法找到如何检索标题信息并在下一次转换中使用它(在您的例子中是ToTableRow)。@Norioakai ExtractHeader只是查看每一行以匹配某个条件,然后只返回该行。不幸的是,这是行不通的。我现在不得不放弃这种方法,但是您可以使用ApacheBeam2.x中新的
DynamicDestinations
来实现类似的结果。希望这有帮助<代码>动态估计在我们希望根据行动态更改BQ表时非常有用,但在我的理解中,不是标题。在我的例子中,我需要从第三方PaaS导入数据,csv格式是我无法控制的,如果一个csv中的所有行都不包含某个字段,它会从整个csv文件中删除该字段,因此我需要读取每个csv的标题并理解其数据结构。是的,这是我们现在不得不离开Beam的原因之一。处理csv文件的唯一其他选择是以某种方式进行预处理,例如在容器中将整个文件转换为json,然后通过Beam进行处理。但这显然带走了所有流媒体的好处,并增加了一些显著的开销。我们最终推出了一个缓慢稳定运行的Java解决方案(一点也不令人尴尬的并行),我明白了。我目前的想法是,因为我们将使用Airflow将作业发布到DataFlow,所以我将提前读取Airflow任务的第一行,并将标题信息作为参数发送到DataFlow,然后在DataFlow中,我可以跳过标题并以分布式方式处理剩余的作业。无论如何,谢谢你提供的信息!到目前为止,我真的很难看到csv标头分析是否有任何doo解决方案。您好@Mitch,我能问一下您在ExtractHeader()中做了什么吗?我正在尝试做同样的事情,但无法找到如何检索标题信息并在下一次转换中使用它(在您的例子中是ToTableRow)。@Norioakai ExtractHeader只是查看每一行以匹配某个条件,然后只返回该行。不幸的是,这是行不通的。我现在不得不放弃这种方法,但是您可以使用ApacheBeam2.x中新的
DynamicDestinations
来实现类似的结果。希望这有帮助<代码>动态估计在我们希望根据行动态更改BQ表时非常有用,但在我的理解中,不是标题。在我的例子中,我需要从第三方PaaS导入数据,csv格式是我无法控制的,如果一个csv中的所有行都不包含某个字段,它会从整个csv文件中删除该字段,因此我需要读取每个csv的标题并理解其数据结构。是的,这是我们现在不得不离开Beam的原因之一。处理csv文件的唯一其他选择是以某种方式进行预处理,例如在容器中将整个文件转换为json,然后通过Beam进行处理。但这显然带走了所有流媒体的好处,并增加了一些显著的开销。我们最终推出了一个缓慢稳定运行的Java解决方案(一点也不令人尴尬的并行),我明白了。我目前的想法是,因为我们将使用Airflow将作业发布到DataFlow,所以我将提前读取Airflow任务的第一行,并将标题信息作为参数发送到DataFlow,然后在DataFlow中,我可以跳过标题并以分布式方式处理剩余的作业。无论如何,谢谢你提供的信息!我真的很难看到现在是否有任何针对csv头分析的doo解决方案。