生产环境_Spark处理轨迹中跨越本初子午线的经度列

        使用spark处理数据集,解决gis轨迹点在地图上跨本初子午线的问题,这个问题很复杂,先补充一版我写的

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

import org.apache.spark.sql.types.{StringType, StructField, StructType}

// by_20231215
// 作者:https://blog.csdn.net/qq_52128187?type=blog
object lon_benchuziwuxian {
  def main(args: Array[String]): Unit = {

    val conf = new SparkConf().setAppName("Parent_child_v3").setMaster("local[1]")
    val sc = new SparkContext(conf)
    val spark = SparkSession.builder.appName("Parent_child_v3").getOrCreate()

    import spark.implicits._



    // 数据
    val data = Seq(
      (1, 178.0, 40.0, "2022-08-15 12:00:00"),
      (1, -179.0, 45.0, "2022-08-15 12:30:00"),
      (1, -170.0, 50.0, "2022-08-15 13:00:00")
    )

    // 数据集的schema
    val columns = Seq("id", "lon", "lat", "time")
    val trajDataFrame = data.toDF(columns: _*)

    // 处理跨越本初子午线的经度
    val processedDataFrame = trajDataFrame.withColumn("lon_processed",
      when(col("lon") < 0, col("lon") + 360).otherwise(col("lon")))

    processedDataFrame.show()

//    // 处理跨越本初子午线的经度
//    val processedDataFrame = trajDataFrame.withColumn("lon_processed",
//      when(col("lon") < 0, col("lon") + 360).otherwise(col("lon")))
//
//    // 按id和时间排序
//    val sortedDataFrame = processedDataFrame.orderBy("id", "time")
//
//    // 调整经度以避免跨越本初子午线
//    val adjustedDataFrame = sortedDataFrame.withColumn("lon_adjusted",
//      when(abs(col("lon_processed") - lag("lon_processed", 1).over(Window.partitionBy("id").orderBy("time"))) > 180,
//        when(col("lon_processed") > lag("lon_processed", 1).over(Window.partitionBy("id").orderBy("time")), col("lon_processed") - 360)
//          .otherwise(col("lon_processed") + 360)
//      ).otherwise(col("lon_processed"))
//    )
//
//    // 将经纬度点按时间形成一条轨迹字符串
//    val trajStringDF = adjustedDataFrame.groupBy("id").agg(collect_list(struct("lon_adjusted", "lat", "time")).as("trajectory"))
//
//    trajStringDF.show(false)

  }
}

相关推荐

  1. Spark在降增效一些思考

    2023-12-16 12:24:02       53 阅读
  2. spring 项目如何处理跨越cors问题

    2023-12-16 12:24:02       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-16 12:24:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-16 12:24:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-16 12:24:02       82 阅读
  4. Python语言-面向对象

    2023-12-16 12:24:02       91 阅读

热门阅读

  1. 三种决策树算法

    2023-12-16 12:24:02       48 阅读
  2. 前端面试题:什么是对称加密和非对称加密?

    2023-12-16 12:24:02       60 阅读
  3. 低频量化日报

    2023-12-16 12:24:02       49 阅读
  4. P6492 [COCI2010-2011#6] STEP 题解

    2023-12-16 12:24:02       42 阅读
  5. docker 清除不用的容器数据

    2023-12-16 12:24:02       51 阅读
  6. 电子显示器件:现代信息显示技术的核心

    2023-12-16 12:24:02       60 阅读
  7. VueRouter的编程式导航和导航守卫

    2023-12-16 12:24:02       53 阅读