7

这些天我读了很多关于我的Apache Avro书,我更倾向于使用它而不是使用JSON. 目前,我们正在做的是,我们正在JSON使用序列化文档Jackson,然后将该序列化JSON文档写入Cassandra每个row key/user id. 然后我们有一个 REST 服务,它使用行键读取整个JSON文档,然后反序列化并进一步使用它。

我们将像这样写入 Cassandra——

user-id   column-name   serialize-json-document-value

下面是一个示例,它显示了我们正在写入 Cassandra 的 JSON 文档。此 JSON 文档适用于特定的行键/用户 ID。

{
  "lv" : [ {
    "v" : {
      "site-id" : 0,
      "categories" : {
        "321" : {
          "price_score" : "0.2",
          "confidence_score" : "0.5"
        },
        "123" : {
          "price_score" : "0.4",
          "confidence_score" : "0.2"
        }
      },
      "price-score" : 0.5,
      "confidence-score" : 0.2
    }
  } ],
  "lmd" : 1379214255197
}

现在我们正在考虑使用 Apache Avro,以便我们可以通过使用 Apache Avro 序列化来压缩这个 JSON 文档,然后将它存储在 Cassandra 中。我对此有几个问题-

  1. 是否可以首先使用 Apache Avro 序列化上述 JSON 文档,然后将其写入 Cassandra?如果是,我该怎么做?谁能提供一个简单的例子?
  2. 我们还需要反序列化它,同时从我们的 REST 服务中读取 Cassandra。这也可以吗?

下面是我的简单代码,它序列化 JSON 文档并在控制台上打印出来。

public static void main(String[] args) {

    final long lmd = System.currentTimeMillis();

    Map<String, Object> props = new HashMap<String, Object>();
    props.put("site-id", 0);
    props.put("price-score", 0.5);
    props.put("confidence-score", 0.2);

    Map<String, Category> categories = new HashMap<String, Category>();
    categories.put("123", new Category("0.4", "0.2"));
    categories.put("321", new Category("0.2", "0.5"));
    props.put("categories", categories);

    AttributeValue av = new AttributeValue();
    av.setProperties(props);

    Attribute attr = new Attribute();
    attr.instantiateNewListValue();
    attr.getListValue().add(av);
    attr.setLastModifiedDate(lmd);

    // serialize it
    try {
        String jsonStr = JsonMapperFactory.get().writeValueAsString(attr);

        // then write into Cassandra
        System.out.println(jsonStr);
    } catch (JsonGenerationException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Serialzie JSON 文档看起来像这样 -

{"lv":[{"v":{"site-id":0,"categories":{"321":{"price_score":"0.2","confidence_score":"0.5"},"123":{"price_score":"0.4","confidence_score":"0.2"}},"price-score":0.5,"confidence-score":0.2}}],"lmd":1379214255197}

AttributeValueAttribute班级正在使用Jackson Annotations.

还有一个重要的注意事项,上述 json 文档中的属性将根据列名而改变。对于不同的列名,我们有不同的属性。有些列名将有两个属性,有些将有 5 个属性。因此,根据我们拥有的元数据,上述 JSON 文档将具有正确的属性和值。

我希望这个问题足够清楚。谁能为此提供一个简单的示例,我如何使用 Apache Avro 实现这一点。我刚开始使用 Apache Avro,所以我遇到了很多问题..

4

2 回答 2

1

由于您已经使用 jackson,您可以尝试使用Jackson 数据格式模块来支持 Avro 编码数据

于 2015-06-25T13:29:01.500 回答
0

Avro 需要一个模式,所以你必须在使用它之前设计它;并且用法与自由格式的 JSON 有很大不同。

但是,您可能需要考虑微笑而不是 Avro,它是 JSON 的一对一二进制序列化,专为您可能希望在 JSON 和二进制数据之间来回切换的用例而设计;例如,使用 JSON 进行调试,或在为 Javascript 客户端提供服务时。

Jackson 有 Smile 后端(请参阅https://github.com/FasterXML/jackson-dataformat-smile),使用 Smile 代替(或除此之外)JSON 确实是单行更改。很多项目都使用它(例如Elastic Search),格式成熟稳定;Jackson 提供的工具支持广泛适用于不同的数据类型。

于 2013-09-17T03:57:26.813 回答