Функция ST_geomfromtext с использованием Spark / java - PullRequest
2 голосов
/ 10 июля 2020

Поскольку ST_GeomFromText не является частью орг. apache .spark. sql .функций, поэтому он не распознает его внутренне. Мне нужно сначала определить UDF для этой функции. означает, что мне нужно определить определение этой функции, а затем зарегистрировать эту функцию с помощью Spark как UDF, тогда только я могу использовать эту функцию.

Я застрял в начале определения этой функции, какие параметры будут принимать.

РЕДАКТИРОВАТЬ

Я использовал следующий код:

 sparkSession.udf().register("ST_GeomFromText", new UDF1<String, String>() {
        @Override
        public String call(String txt ) {
            return (new ST_GeomFromText(txt));
        }
    }, DataTypes.StringType);

Мне действительно нужна ваша помощь.

Спасибо

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Аналогичный вопрос -

  1. Библиотека GeoSpark с использованием Spark Java
  2. Из ResultSet в фрейм данных Spark с использованием Java
  3. GeoSpark с использованием Spark / Java
  4. Неопределенная функция: 'ST_GeomFromText' с использованием Spark / Java

Я думаю, вы не выполнили GeoSpark SQL -Overview / # quick-start полностью-

  1. Для быстрого старта вам нужно добавить GeoSpark-core и GeoSpark SQL в ваш проект POM. xml или build.sbt
<!-- Geo spark lib doc - https://datasystemslab.github.io/GeoSpark/api/sql/GeoSparkSQL-Overview/#quick-start-->
        <dependency>
            <groupId>org.datasyslab</groupId>
            <artifactId>geospark-sql_2.3</artifactId>
            <version>1.3.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.vividsolutions/jts -->
        <dependency>
            <groupId>com.vividsolutions</groupId>
            <artifactId>jts</artifactId>
            <version>1.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.datasyslab/geospark-viz -->
        <dependency>
            <groupId>org.datasyslab</groupId>
            <artifactId>geospark-viz_2.3</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.datasyslab</groupId>
            <artifactId>geospark</artifactId>
            <version>1.3.1</version>
        </dependency>
Объявите сеанс Spark
SparkSession sparkSession = SparkSession.builder()
                .config("spark.serializer", KryoSerializer.class.getName())
                .config("spark.kryo.registrator", GeoSparkKryoRegistrator.class.getName())
                .master("local[*]")
                .appName("myGeoSparkSQLdemo")
                .getOrCreate();
Зарегистрируйте все функции от geospark-sql_2.3 до sparkSession, чтобы его можно было использовать напрямую. sql
// register all functions from geospark-sql_2.3 to sparkSession
GeoSparkSQLRegistrator.registerAll(sparkSession);

Теперь вот рабочий пример -

   SparkSession sparkSession = SparkSession.builder()
                .config("spark.serializer", KryoSerializer.class.getName())
                .config("spark.kryo.registrator", GeoSparkKryoRegistrator.class.getName())
                .master("local[*]")
                .appName("myGeoSparkSQLdemo")
                .getOrCreate();

        // register all functions from geospark-sql_2.3 to sparkSession
        GeoSparkSQLRegistrator.registerAll(sparkSession);
        try {
            System.out.println(sparkSession.catalog().getFunction("ST_Geomfromtext"));
            // Function[name='ST_GeomFromText', className='org.apache.spark.sql.geosparksql.expressions.ST_GeomFromText$', isTemporary='true']
        } catch (Exception e) {
            e.printStackTrace();
        }
        // https://datasystemslab.github.io/GeoSpark/api/sql/GeoSparkSQL-Function/
        Dataset<Row> dataframe = sparkSession.sql("select ST_GeomFromText('POINT(-7.07378166 33.826661)')");
        dataframe.show(false);
        dataframe.printSchema();
        /**
         * +---------------------------------------------+
         * |st_geomfromtext(POINT(-7.07378166 33.826661))|
         * +---------------------------------------------+
         * |POINT (-7.07378166 33.826661)                |
         * +---------------------------------------------+
         */

        // using longitude and latitude column from existing dataframe
        Dataset<Row> df = sparkSession.sql("select -7.07378166 as longitude, 33.826661 as latitude");
        df.withColumn("ST_Geomfromtext ",
                expr("ST_GeomFromText(CONCAT('POINT(',longitude,' ',latitude,')'))"))
        .show(false);
        /**
         * +-----------+---------+-----------------------------+
         * |longitude  |latitude |ST_Geomfromtext              |
         * +-----------+---------+-----------------------------+
         * |-7.07378166|33.826661|POINT (-7.07378166 33.826661)|
         * +-----------+---------+-----------------------------+
         */
1 голос
/ 10 июля 2020

Я думаю, вам следует использовать для этого библиотеку типа GeoSpark . Я не вижу здесь функции ST_Geomfromtext, но она работает для других форматов, таких как WKT https://datasystemslab.github.io/GeoSpark/api/sql/GeoSparkSQL-Constructor/#st_geomfromwkt. Есть много других опций и функций, уже реализованных для геометрических типов данных, которые, я считаю, значительно облегчат вам жизнь при вычислении площадей, точек пересечения, пересечений и т. Д. c (например), если вам это нужно.

Я не уверен, какую БД вы используете (Postgis, SQL Server Spacial, et c.), Но определение этой функции ST_Geomfromtext может немного отличаться между ними, но WKT должен быть таким же, как и стандарт определение геометрии

Надеюсь, это поможет

...