使用Beam读取记录时重命名列?

时间:2019-02-09 10:40:03

标签: google-cloud-dataflow apache-beam

  • 我正在尝试使用现有的Google示例代码{X = 0, Y = 0}来解析(PubSubToBigQuery.java)日志消息并将其推送到StackDriver

  • 问题是SD日志字段的名称之一为BigQuery,BigQuery不接受。因此,我在"@type"中使用不同的字段名称(mytest)创建了该表。

  • 现在,当我运行BigQuery时,显然会收到错误消息

      找不到

    “ @ type”字段。

  • 如何在Beam代码中将列名从PubSubToBigQuery.java重命名为"@type"

1 个答案:

答案 0 :(得分:0)

如果您只想将Stackdriver日志未更改地放入BigQuery中,则可以使用Stackdriver的内置导出功能并创建一个BigQuery接收器:https://cloud.google.com/logging/docs/export/

如果某种导出对您不可行,则可以在Beam中修改转换逻辑。

在这种情况下,PubSubToBigQuery.java,BigQueryIO使用TableRow PCollection作为输入来将消息写入BigQuery。 PubsubMessageToTableRow PTransform通过一些错误处理将PubpubMessage转换为TableRow。 您可以添加具有自定义DoFn的ParDo,以更改创建的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);
}

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