Вызов существующего 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. Примечание: это был полезный пост, но не по моему требованию.

0 ответов

Другие вопросы по тегам