通过 ignite 进行映射对象查询
Posted
技术标签:
【中文标题】通过 ignite 进行映射对象查询【英文标题】:Map object query over ignite 【发布时间】:2016-04-05 09:06:16 【问题描述】:我是 Ignıte 的初学者。我正在做一个示例应用程序来测量它的查询时间。
所以缓存中的key是String,value是Map。 value Map 中的字段之一是“order_item_subtotal”,因此查询如下:
select * from Map where order_item_subtotal>400
示例代码为:
Ignite ignite= Ignition.ignite();
IgniteCache<String, Map<String, Object>> dummyCache= ignite.getOrCreateCache(cfg);
Map<String,Map<String, Object>> bufferMap=new HashMap<String,Map<String, Object>>();
int i=0;
for (String jsonStr : jsonStrs)
if(i%1000==0)
dummyCache.putAll(bufferMap);
bufferMap.clear();
Map data=mapper.readValue(jsonStr, Map.class);
bufferMap.put(data.get("order_item_id").toString(), data);
i++;
SqlFieldsQuery asd=new SqlFieldsQuery("select * from Map where order_item_subtotal>400");
List<List<?>> result= dummyCache.query(asd).getAll();
但结果总是“[]”,表示为空。并且没有错误或异常。
我在这里缺少什么?有什么想法吗?
PS:下面的示例数据
order_item_id=99, order_item_order_id=37, order_item_product_id=365, order_item_quantity=1, order_item_subtotal=59.9900016784668, order_item_product_price=59.9900016784668, product_id=365, product_category_id=17, product_name=Perfect Fitness Perfect Rip Deck, product_description=, product_price=59.9900016784668, product_image=http://images.acmesports.sports/Perfect+Fitness+Perfect+Rip+Deck
【问题讨论】:
【参考方案1】:不支持。您应该使用简单的 POJO 类而不是地图来使其工作。
请注意,Ignite 将以二进制格式存储数据,并且在运行查询时不会反序列化对象。所以你仍然不需要在服务器节点上部署类定义。更多详情请参考此页面:https://apacheignite.readme.io/docs/binary-marshaller
【讨论】:
好像是这样 :( 像我这样的情况,需要在运行时扩展数据结构,并且缺乏查询扩展数据的能力,这绝对是一个需要解决的问题。谢谢 @Neron,如果使用二进制格式(这是默认格式),您可以动态更改架构:apacheignite.readme.io/docs/binary-marshaller。你甚至可以使用BinaryObjectBuilder
并且根本没有任何类定义。当前唯一的限制是 SQL 模式仍然是静态的,也就是说,如果您添加一个字段,您就不能在查询中使用它或对其编制索引。这将在未来的版本中解决。
感谢您的解释,我当时也是 :) 当我们尝试查询它时,这也使得存储对多态性不敏感以上是关于通过 ignite 进行映射对象查询的主要内容,如果未能解决你的问题,请参考以下文章
apache ignite系列:使用ddl和dml脚本初始化ignite并使用mybatis查询缓存
基于Ignite+Lucene+Log4j2的分布式统一日志查询最佳实践
使用 JDBC 瘦客户端通过 SSL 连接到 Ignite 集群