Google bigquery 如何从Apache Beam KafkaIO中的卡夫卡主题推断avro模式

Google bigquery 如何从Apache Beam KafkaIO中的卡夫卡主题推断avro模式,google-bigquery,apache-beam,confluent-schema-registry,apache-beam-io,apache-beam-kafkaio,Google Bigquery,Apache Beam,Confluent Schema Registry,Apache Beam Io,Apache Beam Kafkaio,我使用ApacheBeam的kafkaIO来阅读一个主题,该主题在Confluent schema registry中有一个avro模式。 我能够反序列化消息并写入文件。但最终我想写信给BigQuery。我的管道无法推断模式。 如何提取/推断模式并将其附加到管道中的数据,以便下游进程(写入BigQuery)可以推断模式 下面是我使用模式注册表url设置反序列化器的代码,以及我从Kafka读取的代码: consumerConfig.put(

我使用ApacheBeam的kafkaIO来阅读一个主题,该主题在Confluent schema registry中有一个avro模式。 我能够反序列化消息并写入文件。但最终我想写信给BigQuery。我的管道无法推断模式。 如何提取/推断模式并将其附加到管道中的数据,以便下游进程(写入BigQuery)可以推断模式

下面是我使用模式注册表url设置反序列化器的代码,以及我从Kafka读取的代码:

    consumerConfig.put(
                        AbstractKafkaAvroSerDeConfig.SCHEMA_REGISTRY_URL_CONFIG, 
                        options.getSchemaRegistryUrl());

String schemaUrl = options.getSchemaRegistryUrl().get();
String subj = options.getSubject().get();

ConfluentSchemaRegistryDeserializerProvider<GenericRecord> valDeserializerProvider =
            ConfluentSchemaRegistryDeserializerProvider.of(schemaUrl, subj);

pipeline
        .apply("Read from Kafka",
                KafkaIO
                        .<byte[], GenericRecord>read()
                        .withBootstrapServers(options.getKafkaBrokers().get())
                        .withTopics(Utils.getListFromString(options.getKafkaTopics()))
                        .withConsumerConfigUpdates(consumerConfig)
                        .withValueDeserializer(valDeserializerProvider)
                        .withKeyDeserializer(ByteArrayDeserializer.class)

                        .commitOffsetsInFinalize()
                        .withoutMetadata()

        );
consumerConfig.put(
AbstractKafkaAvroSerDeConfig.SCHEMA\u REGISTRY\u URL\u CONFIG,
options.getSchemaRegistryUrl());
字符串schemaUrl=options.getSchemaRegistryUrl().get();
字符串sub=options.getSubject().get();
合流SchemaRegistryDeserializerProvider valDeserializerProvider=
合流模式注册表序列化提供程序(schemaUrl,subject);
管道
.apply(“读自卡夫卡”,
卡夫卡约
.读()
.WithBootsTrapServer(options.getKafkaBrokers().get())
.withTopics(Utils.getListFromString(options.getKafkaTopics()))
.withConsumerConfigUpdates(consumerConfig)
.withValueDeserializer(valDeserializerProvider)
.withKeyDeserializer(ByteArraydSerializer.class)
.CommitteofSetsinFinalize()
.without元数据()
);
我最初认为这足以让beam推断模式,但事实并非如此,因为hasSchema()返回false


如有任何帮助,我们将不胜感激。

支持推断Avro模式,该模式存储在
KafkaIO
的合流模式注册表中。不过,现在也可以在用户管道代码中执行此操作。

此代码可能会工作,但我尚未测试

// Fetch Avro schema from CSR
SchemaRegistryClient registryClient = new CachedSchemaRegistryClient("schema_registry_url", 10);
SchemaMetadata latestSchemaMetadata = registryClient.getLatestSchemaMetadata("schema_name");
Schema avroSchema = new Schema.Parser().parse(latestSchemaMetadata.getSchema());

PipelineOptions options = PipelineOptionsFactory.create();
Pipeline p = Pipeline.create(options);


// Create KafkaIO.Read with Avro schema deserializer
KafkaIO.Read<String, GenericRecord> read = KafkaIO.<String, GenericRecord>read()
    .withBootstrapServers("host:port")
    .withTopic("topic_name")
    .withConsumerConfigUpdates(ImmutableMap.of("schema.registry.url", schemaRegistryUrl))
    .withKeyDeserializer(StringDeserializer.class)
    .withValueDeserializerAndCoder((Class) KafkaAvroDeserializer.class, AvroCoder.of(avroSchema));

// Apply Kafka.Read and set Beam schema based on Avro Schema
p.apply(read)
 .apply(Values.<GenericRecord>create()).setSchema(schema,
    AvroUtils.getToRowFunction(GenericRecord.class, avroSchema),
    AvroUtils.getFromRowFunction(GenericRecord.class))
//从CSR获取Avro架构
SchemaRegistryClient registryClient=new CachedSchemaRegistryClient(“schema\u registry\u url”,10);
SchemaMetadata latestSchemaMetadata=registryClient.getLatestSchemaMetadata(“schema_name”);
Schema avroSchema=newschema.Parser().parse(latestSchemaMetadata.getSchema());
PipelineOptions=PipelineOptionsFactory.create();
Pipeline p=Pipeline.create(选项);
//使用Avro模式反序列化器创建KafkaIO.Read
KafkaIO.Read-Read=KafkaIO.Read()
.WithBootstrapServer(“主机:端口”)
.withTopic(“主题名称”)
.withConsumerConfigUpdates(ImmutableMap.of(“schema.registry.url”,schemaRegistryUrl))
.withKeyDeserializer(StringDeserializer.class)
.withValueDeserializerAndCoder((Class)kafkaavroderializer.Class,AvroCoder.of(avroSchema));
//应用Kafka.Read并基于Avro模式设置Beam模式
p、 申请(阅读)
.apply(Values.create()).setSchema(schema,
AvroUtils.getToRowFunction(generiRecord.class,avroSchema),
AvroUtils.getFromRowFunction(generiRecord.class))

然后我想你可以使用
BigQueryIO.Write
useBeamSchema()

谢谢你的回复。我该怎么做呢?通过http调用获取模式并使用AvroIO设置模式?我在一个单独的响应中回答。谢谢!我尝试使用
.withValueDeserializerAndCoder((类