2014-06-06 3 views
0

Я работаю над клиентом riak-java. делая Mapreduce, я получил следующий результат. Теперь я хочу получить сумму ticketValue из набора результатов, который я получил. Я хочу получить его, передав идентификатор пользователя.Чтобы получить сумму определенного значения из набора результатов в riak

обновление

Из этого метода я получить Resultset ниже

def fetchTicketValue(userID:String): Boolean = { 
    try{ 
     val result = riakClient.mapReduce("table-ticket","userID:Kim") 
     .addMapPhase(new NamedJSFunction("Riak.mapValuesJson"),true) 
     .execute 
     val o:String = result.getResultRaw 
    }catch{ 
     case e : Exception => 
     e.printStackTrace 
    } 
    true 
    } 

Я забыл упомянуть большой кронштейн [{....}, {....}, { ....}] заблаговременно.

[{"ticketValue":3,"userID":"Kim","Date":"date","ticketID":"98394kjdf","ticketSource":"reg"},{"ticketValue":3,"userID":"Kim","Date":"date","ticketID":"98394kjdf","ticketSource":"reg"},{"ticketValue":3,"userID":"Kim","Date":"date","ticketID":"98394kjdf","ticketSource":"reg"}] 

LIKE: userID:"kim" 

RESULT: ticketValue:9 

Как я могу получить данные? Любая идея будет высоко оценена. Спасибо заранее.

(Riak Версия: 1.3.2 и Riak Java Client: 1.1.4)

+0

Вы хотите, чтобы вычислить сумму в Scala или в фазе снижения? – Joe

+0

(Я не знаю Riak.) Является ли результат возвращен как голая строка, как вы написали ее выше? –

+0

Позвольте мне объяснить вам пример SQL. Вышеупомянутая строка является тем же результатом, что и запрос, похожий на этот 'Select * from table_name, где userID =« Kim »' – Uraniium

ответ

0

Вы дали взглянуть на Jerkson библиотеки (ее отказались, насколько я знаю, но все еще обеспечивает хорошее функциональность), его оболочка scala для библиотеки Jackson для java, использующая библиотеку Play JSON по умолчанию, является хорошей идеей, но с момента ее получения устарел от 2.11. и Джеркссон намного легче.

Использование Jerkson вы могли бы попробовать это, код за себя, я была такая же проблема недавно Link ->

var sum:Int = 0 
val parsedList = parse[List[Ticket]](result.getResultRaw) 
for (e <-parsedList){ 
    sum = sum + e.ticketValue 
} 
println("Final sum: "+sum) 
0
import scala.util.parsing.json.JSON 

case class Row(ticketValue: Int, userId: String, date: String, ticketId: String, ticketSource: String) 

// I'm sure there's a way to do this more cleanly; using it as an implicit maybe 
def mapToRow(m: Any): Row = { 
    val typedM = m.asInstanceOf[Map[String, Any]] 
    Row(typedM("ticketValue").asInstanceOf[Double].toInt, 
    typedM("userID").toString, 
    typedM("Date").toString, 
    typedM("ticketID").toString, 
    typedM("ticketSource").toString) 
} 

def getSum(result: String, userId: String) = { 
    val rows = JSON.parseFull("[" + result + "]").get.asInstanceOf[Seq[Map[String, Any]]].map(mapToRow) 
    rows.filter(_.userId == userId).map(_.ticketValue).sum 
} 


val result = """{"ticketValue":3,"userID":"Samy","Date":"date","ticketID":"98394kjdf","ticketSource":"reg"},{"ticketValue":3,"userID":"Kim","Date":"date","ticketID":"98394kjdf","ticketSource":"reg"},{"ticketValue":3,"userID":"Kim","Date":"date","ticketID":"98394kjdf","ticketSource":"reg"},{"ticketValue":3,"userID":"Kim","Date":"date","ticketID":"98394kjdf","ticketSource":"reg"}""" 
getSum(result, "Kim") 
+0

Результат вашего ответа такой же, как и мне, но строка ** String **, которую я предоставил, не является пустой строкой, она является ** datatable **, как в sql. В соответствии с вашим ответом в ** mapToRow **, когда я печатаю значение ** m ** в консоли, я получаю ** Карта (...) ** отдельно на каждой итерации, но в моем случае я получаю ** Список (Карта (...), Map (...), (...)) ** все на одной итерации. для лучшего понимания, я обновил свой вопрос. Извините за неудобства Я новичок в программировании и в блогах. Спасибо. – Uraniium

+0

@Uraniium Вы можете сделать карту из списка карт следующим образом: 'm.reduce (_ ++ _)'. –

+0

не могли бы вы объяснить мне немного больше о том, как использовать 'm.reduce (_ ++ _)'. – Uraniium

Смежные вопросы