【问题标题】:ST_geomfromtext function using Spark / javaST_geomfromtext 函数使用 Spark/java
【发布时间】:2020-10-30 23:13:41
【问题描述】:

由于 ST_GeomFromText 不是 org.apache.spark.sql.functions 的一部分,所以它不会在内部识别它。我需要首先为这个函数定义 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);

我真的需要你的帮助。

谢谢

【问题讨论】:

标签: java sql dataframe apache-spark


【解决方案1】:

类似的问题-

  1. GeoSpark librairy using Spark Java
  2. From ResultSet to Spark dataframe using Java
  3. GeoSpark using Spark / Java
  4. Undefined function: 'ST_GeomFromText' Using Spark / Java

我想,你还没有完全关注GeoSparkSQL-Overview/#quick-start-

  1. 根据快速入门,您需要将 GeoSpark-core 和 GeoSparkSQL 添加到您的项目 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>
  1. 声明您的 Spark 会话
SparkSession sparkSession = SparkSession.builder()
                .config("spark.serializer", KryoSerializer.class.getName())
                .config("spark.kryo.registrator", GeoSparkKryoRegistrator.class.getName())
                .master("local[*]")
                .appName("myGeoSparkSQLdemo")
                .getOrCreate();
  1. geospark-sql_2.3的所有函数注册到sparkSession,这样就可以直接使用spark-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)|
         * +-----------+---------+-----------------------------+
         */

【讨论】:

【解决方案2】:

我认为您应该为此使用像 GeoSpark 这样的库。我没有看到函数 ST_Geomfromtext 存在,但它适用于 WKT https://datasystemslab.github.io/GeoSpark/api/sql/GeoSparkSQL-Constructor/#st_geomfromwkt 等其他格式。已经在几何数据类型上实现了许多其他选项和功能,我相信它们将使您的生活更容易计算面积、交叉点、交叉点等(例如),如果您必须这样做的话。

我不确定您使用的是什么数据库(Postgis、SQL Server Spacial 等),但该函数 ST_Geomfromtext 的定义可能略有不同,但 WKT 应该是相同的,因为它是几何的标准定义

希望对你有帮助

【讨论】:

  • 我正在使用 MySql 数据库
  • Lopez M 我的东西 GeoSpark 是为 python 而不是 java !
  • Lopez M,如果您对我如何使用 java 语言在数据框中的 spark 上做到这一点有任何想法,我将不胜感激。
猜你喜欢
  • 2020-10-30
  • 2020-10-27
  • 2020-10-29
  • 1970-01-01
  • 2016-12-20
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多