解析Scalding中的JSON嵌套输入

时间:2014-05-22 23:34:45

标签: json scalding

我有一些需要解析和处理的JSON输入(这是我第一次使用JSON)。我的意见如下:

{"id":"id2","v":2, "d":{"Location":"JPN"})
{"id":"id1","v":1, "d":{"Location":"USA"}}
{"id":"id2","v":1, "d":{"Location":"JPN"}}
{"id":"id1","v":2, "d":{"Location":"USA"}}

我的目标是编写一个烫印脚本,按位置字段对输入进行分组并输出计数。在上面的例子中," JPN"和"美国"每个应该有2个。 Scalding提供了一个名为JsonLine的类。我的脚本如下:

class ParseJsonLine(args: Args) extends Job(args) { 

  JsonLine(args("input"), ('id, 'v, 'd)).read
    .groupBy('d){_.size}
    .write(args("output"))   
}

上面的代码编译正常,但在运行时会产生以下错误:

Caused by: java.lang.ClassCastException: scala.collection.immutable.Map$Map1 cannot be cast to java.lang.Comparable

基本上,我不确定如何引用位置字段。 " d.Location"没有工作和分组的复杂结构" d"产生上面的arity错误。 我没有在烫伤中使用json找到太多嵌套输入解析的例子。另外,我不确定嵌套输入是否有比JsonLine更好的东西。

感谢您的帮助。

感谢

1 个答案:

答案 0 :(得分:0)

也许使用Symbol?

查看单元测试:https://github.com/twitter/scalding/blob/0.11.0/scalding-json/src/test/scala/com/twitter/scalding/JsonLineTest.scala

 JsonLine(args("input"), ('id, 'v, Symbol("d.Location"))).read
    .groupBy(Symbol("d.Location")){_.size}
    .write(args("output"))

注意:这里的学习者可以随心所欲地进行即兴/纠正/教育。