Google cloud dataflow 使用Beam读取记录时是否重命名列?
我正在尝试使用现有的google示例代码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
(pubsubbigquery.java)
来解析StackDriver
日志消息,并将它们推送到BigQuery
中
“@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)输出接收器输出(克隆);