выражение искрового регистра для SQL DSL - PullRequest
0 голосов
/ 05 июля 2018

Как я могу получить доступ к выражению катализатора (не обычному UDF) в API Spark SQL scala DSL?

http://geospark.datasyslab.org допускает только текстовое исполнение

GeoSparkSQLRegistrator.registerAll(sparkSession)
var stringDf = sparkSession.sql(
  """
    |SELECT ST_SaveAsWKT(countyshape)
    |FROM polygondf
  """.stripMargin)

Когда я пытаюсь использовать SQL Scala DSL df.withColumn("foo", ST_Point(col("x"), col("y"))) Я получаю сообщение об ошибке типа несоответствие ожидаемый столбец получил ST_Point .

Что мне нужно изменить, чтобы правильно зарегистрировать catalyst expression как объект, который можно вызывать напрямую через scala SQL DSL API?

редактировать

все выражения катализатора зарегистрированы через https://github.com/DataSystemsLab/GeoSpark/blob/fadccf2579e4bbe905b2c28d5d1162fdd72aa99c/sql/src/main/scala/org/datasyslab/geosparksql/UDF/UdfRegistrator.scala#L38:

Catalog.expressions.foreach(f=>sparkSession.sessionState.functionRegistry.createOrReplaceTempFunction(f.getClass.getSimpleName.dropRight(1),f))

edit2

import org.apache.spark.sql.geosparksql.expressions.ST_Point
val  myPoint = udf((x: Double, y:Double) => ST_Point _)

не удается с:

_ must follow method; cannot follow org.apache.spark.sql.geosparksql.expressions.ST_Point.type

Ответы [ 2 ]

0 голосов
/ 14 июля 2018

Вот еще один метод, который вы можете использовать для вызова UDF, и то, что я сделал до сих пор.

      .withColumn("locationPoint", callUDF("ST_Point", col("longitude"),
        col("latitude")))
0 голосов
/ 10 июля 2018

Вы можете получить доступ к выражениям, которые не отображаются в пакете org.apache.spark.sql.functions, используя метод expr. На самом деле он не предоставляет вам UDF-подобный объект в Scala, но он позволяет вам написать оставшуюся часть запроса с помощью API набора данных.

Вот пример из документов :

// get the number of words of each length
df.groupBy(expr("length(word)")).count()
...