无法使用带有查询过滤器的DatastoreInput执行appengine-mapreduce

时间:2014-12-09 13:29:28

标签: java google-app-engine mapreduce

当我尝试使用带有这样的过滤器的数据存储区查询时:

Query billQuery = new Query("Bill"); billQuery.setFilter(new Query.FilterPredicate("payedOn", Query.FilterOperator.GREATER_THAN, new Date()));

并尝试运行: new MapReduceSpecification.Builder, List>>>(new DatastoreInput(billQuery, mapShardCount), new SimpleCounter("BillID"), new CountReducer(), new InMemoryOutput>()) .setKeyMarshaller(Marshallers.getStringMarshaller()) .setValueMarshaller(Marshallers.getLongMarshaller()) .setJobName("MapReduceTest count") .setNumReducers(reduceShardCount) .build();

我得到了这个例外:

java.lang.IllegalArgumentException: payedOn: com.google.appengine.api.datastore.Entity is not a supported property type.

其中'paidOn'是数据存储区实体中具有Date值的属性。

这个例子与[例子]非常相似:

所以我猜我做错了,但我不知道,这是一个标准的数据存储区查询。 有什么建议?

1 个答案:

答案 0 :(得分:2)

这是此行中的错误:https://github.com/GoogleCloudPlatform/appengine-mapreduce/blob/master/java/src/main/java/com/google/appengine/tools/mapreduce/inputs/DatastoreShardStrategy.java#L386 在修复之前,你可以通过提供两个边界(上部和下部)来避免这个问题,或者通过用item.get(0)替换item.get(0)来自己修补它.getProperty(propertyName)