Ошибка в команде MapReduce с MongoDB Java API

1

Я тестирую API-интерфейс MongoDB Java, и я хотел сделать mapReduce. Я реализовал его следующим образом:

String map = "function() { " +
    "emit(this.ts, this.1_bid);}";

String reduce = "function(key, values) {" +
    "return Array.sum(values);}";

MapReduceCommand cmd = new MapReduceCommand(collection, map, reduce, null, MapReduceCommand.OutputType.INLINE, null);
MapReduceOutput out = collection.mapReduce(cmd);

for (DBObject o : out.results()) {
    System.out.println(o.toString());
}

Но когда я его выполняю, у меня есть следующий стек исключений:

[tick_engine] 16:51:53.600 ERROR [MongoTickDataReader] Failed to read data from mongoDB
com.mongodb.CommandFailureException: { "serverUsed" : "/127.0.0.1:27017" , "errmsg" : "exception: SyntaxError: Unexpected token ILLEGAL" , "code" : 16722 , "ok" : 0.0}
    at com.mongodb.CommandResult.getException(CommandResult.java:71) ~[mongo-2.11.1.jar:na]
    at com.mongodb.CommandResult.throwOnError(CommandResult.java:110) ~[mongo-2.11.1.jar:na]
    at com.mongodb.DBCollection.mapReduce(DBCollection.java:1265) ~[mongo-2.11.1.jar:na]
    at com.smarttrade.tickEngine.in.MongoTickDataReader.mapReduce(MongoTickDataReader.java:321) ~[classes/:na]
    at com.smarttrade.tickEngine.in.MongoTickDataReader.readData(MongoTickDataReader.java:157) ~[classes/:na]
    at com.smarttrade.tick.engine.TickEngine.onMarketDataRequest(TickEngine.java:203) [classes/:na]
    at com.smarttrade.tick.sttp.TickMarketDataRequestCommand.execute(TickMarketDataRequestCommand.java:62) [classes/:na]
    at com.smarttrade.st.commands.Command.process(Command.java:140) [src/:na]
    at com.smarttrade.st.server.STTPInvoker$1.process(STTPInvoker.java:385) [src/:na]
    at com.smarttrade.st.server.STTPInvoker$1.process(STTPInvoker.java:1) [src/:na]
    at com.smarttrade.util.concurrent.queue.MultiSessionsBlockingQueue$SimpleSession.run(MultiSessionsBlockingQueue.java:122) [src/:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_51]
    at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]
Теги:

2 ответа

1
Лучший ответ

Кажется, что проблема связана с именем атрибута, которое вы определили - 1_bid

Я создал образцы документов для проверки вашего сокращения карты -

{ "_id" : ObjectId("533ef7d0e1687dd644410d88"), "ts" : "TSKEY", "1_bid" : 200 }
{ "_id" : ObjectId("533ef7d3e1687dd644410d89"), "ts" : "TSKEY", "1_bid" : 300 }
{ "_id" : ObjectId("533ef7d5e1687dd644410d8a"), "ts" : "TSKEY", "1_bid" : 400 }
{ "_id" : ObjectId("533ef7dce1687dd644410d8b"), "ts" : "TSKEY2", "1_bid" : 800 }
{ "_id" : ObjectId("533ef7dfe1687dd644410d8c"), "ts" : "TSKEY2", "1_bid" : 300 }

Я выполнил следующую команду map-reduce -

db.sample4.mapReduce(function() { emit(this.ts, this.1_bid);},function(key, values) {return Array.sum(values);})

Ошибка, которую я получил, это SyntaxError: missing ) after argument list (shell):1

Я понял, что функция, выполняемая этим компоновщиком, является функцией JavaScript, а в Javascript вы не можете иметь переменную, которая начинается с числа. Следовательно, вы получаете синтаксическую ошибку. Затем я создал новый набор документов -

{ "_id" : ObjectId("533eff29e1687dd644410d8d"), "ts" : "TSKEY", "bid_1" : 200 }
{ "_id" : ObjectId("533eff2de1687dd644410d8e"), "ts" : "TSKEY", "bid_1" : 300 }
{ "_id" : ObjectId("533eff34e1687dd644410d8f"), "ts" : "TSKEY", "bid_1" : 400 }
{ "_id" : ObjectId("533eff7fe1687dd644410d92"), "ts" : "TSKEY2", "bid_1" : 800 }
{ "_id" : ObjectId("533eff85e1687dd644410d93"), "ts" : "TSKEY2", "bid_1" : 300 }

а затем модифицировал картограф, чтобы использовать "bid_1" и "bid_1" следующую команду:

db.sample4.mapReduce(function() { emit(this.ts, this.bid_1);},function(key, values) {return Array.sum(values);},"pivot")

Результат был: {"result": "pivot", "timeMillis": 61, "counts": {"input": 12, "emit": 12, "уменьшить": 2, "output": 2}, " ok ": 1,}

db.pivot.find()
{ "_id" : "TSKEY", "value" : 900 }
{ "_id" : "TSKEY2", "value" : 1100 }

Я тестировал это на Java, используя ту же программу, которую вы вставили, и просто изменил имя атрибута на "bid_1" и это сработало

0

Чтобы предотвратить синтаксические ошибки в именах полей, вы также можете записать функцию карты следующим образом:

function() {
  emit(this["ts"], this["1_bid"]);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню