【问题标题】:Parsing JSON with a Hive UDF in Scala在 Scala 中使用 Hive UDF 解析 JSON
【发布时间】:2016-10-13 15:12:08
【问题描述】:

我正在尝试为 Hive 编写一个作用于 JSON 数组的 Scala UDF——扩展 org.apache.hadoop.hive.ql.exec.UDF 并依赖于 play-json 的 play.api.libs.json.parse

尝试从 Hive 中调用它时,我看到 java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonToken.id()I

我不确定原因是什么——与杰克逊版本有些不兼容,如果是这样,我该如何解决这个问题?

我绑定的唯一组件/版本是 Hive 1.2。

【问题讨论】:

  • 你的 JSON 依赖正确吗?您的 UDF jar 是否包含正确版本的 JSON 依赖项?
  • UDF 与其依赖项一起打包(使用 sbt-assembly)(Hadoop/Hive 除外,我正在使用提供的那些)。作为一个独立的功能,它测试/工作正常。
  • UDF fat jar 中jackson core jar 的版本是多少?
  • 我已经尝试了一些......我应该瞄准什么? play-json 版本主要决定了我在这方面的选择。
  • 问题可能是您的集群正在使用导致问题的旧版本的杰克逊 jar,或者有两个不同的 jar 包含相同的类名 [JsonToken],请检查此stackoverflow.com/questions/32142340/…

标签: scala hive udf play-json


【解决方案1】:

查看 Brickhouse (http://github.com/klout/brickhouse) 中的 JSON UDF。 Brickhouse 有 UDF 的 to_jsonfrom_json ,以及方便的函数 json_mapjson_split 直接处理地图和数组。

关于您的版本控制问题,Brickhouse 在幕后使用 jackson,使用 1.8.8 版(以及其他版本),我还没有遇到过这个特定的版本控制问题。

【讨论】:

    【解决方案2】:

    猜测这是 Jackson 不兼容是有道理的。

    Hive 1.2 使用 Jackson 1.9.2,但最新版本(即最近几年)的 Play-JSON 使用更高版本。

    如果恢复到足够旧版本的 Play-JSON 没有意义,那么最简单的解决方法可能是使用不依赖于 Jackson 的 Scala JSON 解析库; Rapture JSON 可以与多个后端一起使用,因此可能是一个不错的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多