Google cloud dataflow 使用Beam读取记录时是否重命名列?

Google cloud dataflow 使用Beam读取记录时是否重命名列?,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,我正在尝试使用现有的google示例代码(pubsubbigquery.java)来解析StackDriver日志消息,并将它们推送到BigQuery中 问题在于,其中一个SD日志字段的名称为“@type”,这是BigQuery不可接受的。因此,我在BigQuery中创建了具有不同字段名(mytest)的表 现在,当我运行pubsubBigQuery.java时,显然我得到了错误消息 未找到“@type”字段 如何在梁代码中将列名从“@type”重命名为“mytype” 如果您只想将Stack

我正在尝试使用现有的google示例代码
(pubsubbigquery.java)
来解析
StackDriver
日志消息,并将它们推送到
BigQuery

  • 问题在于,其中一个SD日志字段的名称为
    “@type”
    ,这是BigQuery不可接受的。因此,我在
    BigQuery
    中创建了具有不同字段名(mytest)的表

  • 现在,当我运行
    pubsubBigQuery.java
    时,显然我得到了错误消息

    未找到“@type”字段

  • 如何在梁代码中将列名从
    “@type”
    重命名为
    “mytype”


  • 如果您只想将Stackdriver日志原封不动地放入BigQuery,您可以使用Stackdriver的内置导出功能并创建一个sink to BigQuery:

    如果导出对您来说不可行,您可以在Beam中修改转换逻辑

    在本例中,BigQueryIO使用TableRow PCollection作为输入,将消息写入BigQuery。PubsubMessageToTableRow ptTransform通过一些错误处理将PubsubMessage转换为TableRow。 可以添加带有自定义DoFn的ParDo,该自定义DoFn会更改所创建TableRow中的列名。流程元素方法可以如下所示:

     @ProcessElement
     public void processElement(@Element TableRow row, OutputReceiver<TableRow> outputReceiver) {
    
        TableRow clone = row.clone();
        Object value = clone.get("@type");
        clone.remove("@type");
        clone.set("mytype", value);
        outputReceiver.output(clone);
    }
    
    @ProcessElement
    公共无效processElement(@Element TableRow行,OutputReceiver OutputReceiver){
    TableRow clone=row.clone();
    Object value=clone.get(“@type”);
    克隆。删除(“@type”);
    克隆.set(“mytype”,值);
    输出接收器输出(克隆);
    }
    

    如果使用未更改的PubSubToBigQuery.java I linked,则可以在代码中第323行附近的
    jsonToTableRowOut.get(TRANSFORM_OUT)
    PCollection上应用此ParDo

    像这样?:.and(TRANSFORM_OUT,jsonToTableRowOut.get(TRANSFORM_OUT).apply(“RenameCol”,ParDo.of(new RenameColumnFn()))静态类RenameColumnFn扩展了DoFn{@ProcessElement public void ProcessElement(@Element TableRow,outputreciver outputreciver){TableRow clone=row.clone();Object value=clone.get(“@type”);clone.remove(@type”);clone.set(“mytype”,value);outputReceiver.output(clone);}}是的,类似这样的,只有RenameColumnFn的超类型应该是
    DoFn
    这样
    静态类RenameColumnFn扩展了DoFn{
    我想我遗漏了什么。我仍然得到:java.lang.RuntimeException:java.io.IOException:Insert失败:[{“errors”:[{“debugInfo”:“location”:“protopayload.@type”,“message”:“no-this-field.”,“reason”:“invalid”}],“index”:“0}]org.apache.beam.sdk.io.gcp.bigquery.StreamingWriteFn.flushRows(StreamingWriteFn.java:142)org.apache.beam.sdk.io.gcp.bigquery.StreamingWriteFn.finishBundle(StreamingWriteFn.java:103),因为它是另一列,不是“@type”,而是“protopayload@type”列。您还需要在创建的TableRow中重置该列的名称。可能还有其他类似的列,因此您的管道可能会出现问题。您确定不能使用Stackdriver的内置导出功能来执行此操作,而不是编写自定义梁管道吗?谢谢。@type是唯一不匹配的。我将其更改为this and still给出相同的错误:TableRow clone=row.clone();Object value=clone.get(“protopayload@type”);clone.remove(“protopayload@type”);clone.set(“protopayload@mytype”,value);outputReceiver.output(clone);value=clone.get(@type”);clone.remove(@type”);clone.set(@mytype,value)输出接收器输出(克隆);