在Apache Avro架构中存储列表或集合

时间:2016-10-19 10:04:57

标签: list collections schema avro

我目前正在创建Avro架构来存储Twitter数据流。 我在JSON中的数据源:

{
'id': '123456789',
'text': 'bla bla bla...',
'entities': {
  'hashtags': [{'text':'hashtag1'},{'text':'hashtag2'}]
  }
}

在Cassandra中,我可以定义集合(集合或列表)来存储主题标签数据。 但我不知道如何在Apache Avro中定义这个结构。

这是我最好的尝试:

{"namespace": "ln.twitter",
 "type": "record",
 "name": "main",
 "fields": [
   {"name": "id","type": "string"},
   {"name": "text","type": "string"},
   {"name": "hashtags","type": "string"} // is there any better format for this ?
 ]
}

请你的意见。

谢谢, Yusata。

1 个答案:

答案 0 :(得分:3)

entities字段需要显式记录(或地图)。这是一个应该有效的架构:

{
  "type": "record",
  "name": "Main",
  "fields": [
    {
      "name": "id",
      "type": "string"
    },
    {
      "name": "text",
      "type": "string"
    },
    {
      "name": "entities",
      "type": {
        "type": "record",
        "name": "Entities",
        "fields": [
          {
            "name": "hashtags",
            "type": {
              "type": "array",
              "items": {
                "type": "record",
                "name": "Hashtag",
                "fields": [
                  {
                    "name": "text",
                    "type": "string"
                  }
                ]
              }
            }
          }
        ]
      }
    }
  ]
}

如果它有用,您可以使用this tool从任何有效的JSON记录生成(匿名)Avro架构。然后,您只需要为record类型添加名称。

'切换为"后,您可以在示例中尝试使用

{
  "id": "123456789",
  "text": "bla bla bla...",
  "entities": {"hashtags": [{"text": "hashtag1"}, {"text": "hashtag2"}]}
}