这个错误通常出现在使用Apache Beam或Google Cloud Dataflow处理BigQuery数据时,表明系统无法自动为TableRow
类找到或创建合适的编码器(Encoder)。
这个错误通常由以下原因引起:
TableRow
对象。// 在PipelineOptions中注册TableRow的编码器
pipeline.getCoderRegistry().registerCoderForClass(
TableRow.class,
TableRowJsonCoder.of()
);
pipeline.getCoderRegistry().registerCoderForClass(
TableRow.class,
AvroCoder.of(TableRow.class)
);
如果上述方法不奏效,可以创建自定义编码器:
public class TableRowCoder extends CustomCoder<TableRow> {
private static final TableRowCoder INSTANCE = new TableRowCoder();
private static final ObjectMapper MAPPER = new ObjectMapper();
public static TableRowCoder of() {
return INSTANCE;
}
@Override
public void encode(TableRow value, OutputStream outStream) throws IOException {
MAPPER.writeValue(outStream, value);
}
@Override
public TableRow decode(InputStream inStream) throws IOException {
return MAPPER.readValue(inStream, TableRow.class);
}
}
// 注册自定义编码器
pipeline.getCoderRegistry().registerCoderForClass(
TableRow.class,
TableRowCoder.of()
);
确保项目中包含以下依赖(以Maven为例):
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-bigquery</artifactId>
<version>v2-rev20230506-2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
<version>${beam.version}</version>
</dependency>
这个问题通常出现在以下场景:
如果问题持续存在,可以考虑将TableRow转换为更简单的数据结构(如Map或POJO)进行处理,这些类型通常有内置编码器支持。
没有搜到相关的文章