如何定义以@开头的字段类型?

How do I define the type of a field starting with a @?

我正在尝试从一些 json 格式的 kakfa 消息创建流,例如:

"beat": {
        "name": "xxxxxxx",
        "hostname": "xxxxxxxxxx",
        "version": "zzzzz"
    },
"log_instance": "forwarder-2",
"type": "prod",
"message": "{ ... json string.... }",
"@timestamp": "2020-06-14T23:31:33.925Z",
"input_type": "log",
"@version": "1"
}

我试过使用

CREATE STREAM  S (
    beat STRUCT<
        name VARCHAR,
        hostname VARCHAR,
        version VARCHAR
    >,
    log_instance VARCHAR,
    type VARCHAR,
    message VARCHAR,   # for brevity - I also have this with a struct
    @timestamp VARCHAR,
    input_type VARCHAR,
    @version` VARCHAR )
WITH (KAFKA_TOPIC='some_topic', VALUE_FORMAT='JSON'); 

但是我得到一个错误:

Caused by: line 10:5: extraneous input '@' expecting ....

我绑定了引号和前面的下划线,但没有成功。我也尝试在注册表中创建一个条目,但我无法通过这种方式创建合法的 avro。

PS。如何将主题“绑定”到注册表架构?

谢谢。

如果您使用的是足够新的 ksqlDB 版本,那么只需引用带有无效字符的列名就可以了:

CREATE STREAM  S (
    beat STRUCT<
        name VARCHAR,
        hostname VARCHAR,
        version VARCHAR
    >,
    log_instance VARCHAR,
    type VARCHAR,
    message VARCHAR,   # for brevity - I also have this with a struct
    `@timestamp` VARCHAR,
    input_type VARCHAR,
    `@version` VARCHAR )
WITH (KAFKA_TOPIC='some_topic', VALUE_FORMAT='JSON'); 

如果上述方法不起作用,那么您可能使用的是旧版本的 ksqlDB。升级应该可以解决这个问题。

PS. How do I "bind" a topic to a registry schema?

如果您使用 JSON_SR 格式,而不只是 JSON

ksqlDB 将自动将 JSON 模式发布到模式注册表。后者仅支持从模式注册表中读取模式。

如果您更多的是询问如何在 SR 中为现有主题注册模式...那么您最好查看 SR 文档。注意,ksqlDB 只支持 TopicNameStrategy naming strategy。值模式具有主题 {topic-name}-value,例如以下为 test 主题的值注册了一个 JSON 模式。

curl -X POST -H "Content-Type: application/vnd.schemaregistry.v1+json" --data '{"schema": "{\"type\":\"record\",\"name\":\"Payment\",\"namespace\":\"io.confluent.examples.clients.basicavro\",\"fields\":[{\"name\":\"id\",\"type\":\"string\"},{\"name\":\"amount\",\"type\":\"double\"}]}"}' http://localhost:8081/subjects/test-value/versions

有关详细信息,请参阅 SR 教程:https://docs.confluent.io/current/schema-registry/schema_registry_tutorial.html

I also tried creating an entry in the registry but I could not create legit avro this way.

Avro 不允许在其字段名称中使用 @。但是,看起来您的数据是 JSON 格式,这确实允许 @。请参阅上面的 curl 示例,了解如何注册 JSON 架构。