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

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

Scala 复制代码
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)

  }
}
相关推荐
材料苦逼不会梦到计算机白富美2 小时前
golang分布式缓存项目 Day 1
分布式·缓存·golang
拓端研究室TRL2 小时前
【梯度提升专题】XGBoost、Adaboost、CatBoost预测合集:抗乳腺癌药物优化、信贷风控、比特币应用|附数据代码...
大数据
黄焖鸡能干四碗2 小时前
信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
大数据·人工智能·软件需求·设计规范·规格说明书
想进大厂的小王2 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构
Java 第一深情2 小时前
高性能分布式缓存Redis-数据管理与性能提升之道
redis·分布式·缓存
编码小袁2 小时前
探索数据科学与大数据技术专业本科生的广阔就业前景
大数据
WeeJot嵌入式3 小时前
大数据治理:确保数据的可持续性和价值
大数据
ZHOU西口4 小时前
微服务实战系列之玩转Docker(十八)
分布式·docker·云原生·架构·数据安全·etcd·rbac
zmd-zk4 小时前
kafka+zookeeper的搭建
大数据·分布式·zookeeper·中间件·kafka
激流丶4 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic