首页 > 解决方案 > Ngrams 在 Hive 中有效,但在 spark-shell (Scala) 中无效

问题描述

我真的陷入了我的问题,我在网上进行了广泛的搜索,但我找不到解决方案,而且我是 Spark-shell (Scala) 的新手。ngrams通过以下命令,功能在 Hive 中工作得非常好:

select ngrams(split(name, '\\W+'), 2, 3) from mytable

它返回列“名称”的前 3 个二元组。当我通过这个命令在 spark-shell 中调用它时

val df = hiveContext.sql("select ngrams(split(name, '\\W+'), 2, 3) from mytable")    

我得到了这些错误:

火花2

org.apache.spark.sql.AnalysisException: Undefined function: 'ngrams'. This function is neither a registered temporary function nor a permanent function registered in the database 'default'.

火花 1.6

org.apache.spark.sql.AnalysisException: No handler for udf class org.apache.hadoop.hive.ql.udf.generic.GenericUDAFnGrams

我也尝试了这些方法但没有成功:

  1. 我与 分开splitngrams即我先跑split,再跑ngrams。令人惊讶的是,split工作正常,但ngrams没有。
  2. 我试过sqlContext.register.udf("ngrams", ngrams)并收到:error: not found: value ngrams
  3. 我使用以下命令添加了 2 个不同的 Jar 文件版本(hive-exec-1.2.0.jar和):hive-exec-3.0.0.jar

    spark-shell --jars /hive-exec-1.2.0.jar

    spark-shell --jars /hive-exec-3.0.0.jar

和同样的错误。

我在这个githubngrams中找到了函数的开源代码,但它是用 Java 编写的,我不知道是否可以在 Spark-shell (Scala) 中调用它。

也许这是一个微不足道的问题,如果有人可以帮助我,我将不胜感激。

我正在使用 Scala 2.11.8、Java 1.8、Spark 2.3.0 和 Spark 1.6

标签: javascalaapache-sparkhiveuser-defined-functions

解决方案


推荐阅读