Вызов существующего UDF Java/Hive в SparkContext без использования HiveContext в приложении Spark-SQL
У меня Spark 1.5.0 работает на кластере. Я хочу использовать Hive UDF из API ESRI. Я могу использовать эти API в Spark Application, но из-за некоторых проблем в моем кластере я не могу использовать HiveContext. Я хочу использовать UDF Exive Hive в приложении Spark-SQL.
// val sqlContext = new SQLContext(sc)
// import sqlContext.implicits._
// val hc = new HiveContext(sc)
// hc.sql("create temporary function ST_Point as 'com.esri.hadoop.hive.ST_Point'")
// hc.sql("create temporary function ST_Within as 'com.esri.hadoop.hive.ST_Within'")
// hc.sql("create temporary function ST_Polygon as 'com.esri.hadoop.hive.ST_Polygon'")
// val resultDF = hc.sql("select ST_Within(ST_Point(2, 3), ST_Polygon(1,1, 1,4, 4,4, 4,1))")
Приведенный выше код предназначен для HiveContext, но я хочу использовать аналогичную вещь в SparkContext, поэтому написал что-то в соответствии с этим-
sqlContext.sql("""create function ST_Point as 'com.esri.hadoopcom.esri.hadoop.hive.ST_Point'""")
Но похоже, что я получаю ту же ошибку. (Увидеть ниже)
Exception in thread "main" java.lang.RuntimeException: [1.1] failure: ``with'' expected but identifier create found
create function ST_Point as 'com.esri.hadoopcom.esri.hadoop.hive.ST_Point'
^
at scala.sys.package$.error(package.scala:27)
Я пытался создавать функции с существующими UDF, но мне кажется, что нужно создать оболочку scala для вызова классов Java. Я пробовал как ниже-
def ST_Point_Spark = new ST_Point()
sqlContext.udf.register("ST_Point_Spark", ST_Point_Spark _)
def ST_Within_Spark = new ST_Within()
sqlContext.udf.register("ST_Within_Spark", ST_Within_Spark _)
def ST_Polygon_Spark = new ST_Polygon()
sqlContext.udf.register("ST_Polygon_Spark", ST_Polygon_Spark _)
sqlContext.sql("select ST_Within_Spark(ST_Point_Spark(2, 3), ST_Polygon_Spark(1,1, 1,4, 4,4, 4,1))")
но в этом случае получаю ошибку-
Exception in thread "main" scala.reflect.internal.Symbols$CyclicReference: illegal cyclic reference involving object InterfaceAudience
at scala.reflect.internal.Symbols$Symbol$$anonfun$info$3.apply(Symbols.scala:1220)
at scala.reflect.internal.Symbols$Symbol$$anonfun$info$3.apply(Symbols.scala:1218)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
Мне просто интересно, есть ли способ вызвать Hive/Java UDF без использования HiveContext, напрямую используя SqlContext. Примечание: это был полезный пост, но не по моему требованию.