售点POI标签计算性能优化实战:Haversine公式与区域化计算的结合

embedded/2025/1/13 0:33:56/

售点POI标签计算脚本性能优化:从UDF到Spark算子的高效转换

在数据处理的领域中,性能优化是一个永恒的话题。特别是在处理大规模数据集时,如何高效地执行计算任务成为了每个数据工程师必须面对的挑战。本文将分享我们在售点POI标签计算脚本性能优化中的一些实践和思考,特别是如何通过减少UDF函数的使用和优化数据计算量来提升整体性能。

1. 减少UDF函数的使用,拥抱Spark算子

在Spark中,UDF(用户定义函数)虽然提供了灵活性,但其执行效率往往不如内置的Spark算子。特别是在处理大规模数据时,UDF的性能瓶颈尤为明显。因此,我们决定尽量减少UDF的使用,转而使用Spark的内置算子来执行计算任务。

1.1 使用Haversine公式计算距离

对于两组经纬度的距离计算,我们采用了Haversine公式。Haversine公式是一种用于计算两个球面坐标点(经度和纬度)之间距离的经典方法。其原理基于球面三角形中的余弦定理,能够高效地计算出两点之间的球面距离。

poi_outlet = poi_outlet.withColumn("dlat", radians(poi_outlet["LATITUDE"]) - radians(poi_outlet["lat"]))
poi_outlet = poi_outlet.withColumn("dlon", radians(poi_outlet["LONGITUDE"]) - radians(poi_outlet["lng"]))
poi_outlet = poi_outlet.withColumn("a",sin(poi_outlet["dlat"]/2)**2 +cos(radians(poi_outlet["LATITUDE"])) * cos(radians(poi_outlet["lat"])) *sin(poi_outlet["dlon"]/2)**2)
poi_outlet = poi_outlet.withColumn("distance", 2 * asin(sqrt(poi_outlet.a))*6371.393*1000)

通过这种方式,我们避免了使用外部库(如geopy)来计算距离,从而减少了不必要的开销。

2. 减少需要计算的数据量

在大规模数据处理中,减少计算量是提升性能的关键。我们通过以下两种方式有效地减少了数据计算量:

2.1 筛除无效数据

首先,我们对售点数据和腾讯POI数据进行了筛选,剔除了那些没有经纬度信息的记录。这一步骤显著减少了需要处理的数据量:

  • 售点数据:从1,650,654条减少到1,167,357条
  • 腾讯POI数据:从30,498,558条减少到29,607,224条

2.2 区域化计算

为了进一步减少计算量,我们以每个售点的经纬度为中心,划定了一个1500米的范围。通过这种方式,我们只计算该范围内的POI数据,从而大幅减少了整体的计算量。

# _lon_res = round(0.0011141771746803184 * 15, 5)  0.01671
# _lat_res = round(0.0009034837993532672 * 15, 5)  0.01355
poi_outlet = poi_outlet.filter((poi_outlet.lng.isNotNull()) & (poi_outlet.LONGITUDE.isNotNull()) &(poi_outlet.lat.isNotNull()) & (poi_outlet.LATITUDE.isNotNull()) &(expr("abs(lng - LONGITUDE) <= 0.01671")) &(expr("abs(lat - LATITUDE) <= 0.01355"))
)

3. 总结

通过减少UDF函数的使用和优化数据计算量,我们成功地提升了售点POI标签计算脚本的性能。这不仅减少了计算时间,还降低了资源消耗,为后续的数据处理任务奠定了坚实的基础。

在未来的工作中,我们将继续探索更多的性能优化方法,以应对日益增长的数据处理需求。希望本文的分享能够为你在数据处理中的性能优化提供一些启发和帮助。


http://www.ppmy.cn/embedded/153418.html

相关文章

【Unity-和WPF结合的优势】

数据处理深度和灵活性的局限 在 Unity 中&#xff1a; Unity 虽然可以处理数据&#xff0c;但它的数据处理能力主要侧重于游戏开发场景相关的数据。对于工业仿真软件中的复杂数据结构和深度业务逻辑处理相对有限。例如&#xff0c;在工业生产中可能涉及到大量的设备参数、工艺…

⭐MySQL的底层原理与架构

前言 了解MySQL的架构和原理对于很多的后续很多的操作会有很大的帮助与理解。并且很多知识都与底层架构相关联。 了解MySQL架构 通过上面的架构图可以得知&#xff0c;Server层中主要由 连接器、查询缓存、解析器/分析器、优化器、执行器 几部分组成的&#xff0c;下面将主要…

解决ERROR: This version of pnpm requires at least Node.js xxx 的问题

1. 复现错误 今天从gitee下载某项目,用来学习前端开发,在执行 npm i -g pnpm命令时,虽然没有报错,但出现不分警告,暂忽略这些警告,执行如下命令时,却报出错误: PS C:\test> pnpm i ERROR: This version of pnpm requires at least Node.js v18.12 The current vers…

【Redis】简介|优点|使用场景|为什么Redis快

目录 一、简介 二、特性&#xff08;优点&#xff09; 三、使用场景 一、简介 内存中存储数据的中间件&#xff0c;用于数据库&#xff0c;数据缓存&#xff0c;在分布式系统中能够大展拳脚 中间件&#xff1a;应用程序可以直接从 Redis 中获取数据&#xff0c;而不必频繁地…

.NET AI 开发人员库 --AI Dev Gallery

AI Dev Gallery是一款应用程序&#xff0c;旨在帮助 Windows 开发人员将 AI 功能集成到他们自己的应用程序和项目中。该应用程序包含以下内容&#xff1a; 超过 25 个由本地 AI 模型提供支持的交互式示例从 Hugging Face 和 GitHub 轻松浏览、下载和运行模型能够查看 C# 源代码…

MySQL8 使用 ProxySQL 来实现 MySQL 主从同步的读写分离和负载均衡

好的,使用 ProxySQL 来实现 MySQL 主从同步的读写分离和负载均衡是一个非常不错的选择!我可以带你逐步了解如何配置和使用 ProxySQL。以下是一个简单的入门教程,帮助你在 MySQL 环境中配置 ProxySQL。 1. 安装 ProxySQL 首先,你需要安装 ProxySQL。它支持多种操作系统,下…

GPT大模型下,如何实现网络自主防御

近年来&#xff0c;随着GPT大模型的出现&#xff0c;安全领域的攻防对抗变得更加激烈。RSAC2023人工智能安全议题重点探讨了人工智能安全的最新发展&#xff0c;包括人工智能合成器安全、安全机器学习以及如何利用渗透测试和强化学习技术来确保人工智能模型的安全性和可靠性。 …

分布式一致性CAP与BASE理论、分布式一致性协议和算法——2PC、3PC 和 Paxos算法

参考&#xff1a;分布式一致性理论——CAP与BASE 分布式一致性理论——CAP与BASE CAP 理论 一致性&#xff08;C&#xff1a;Consistency&#xff09;可用性&#xff08;A&#xff1a;Availability&#xff09;分区容错性&#xff08;P&#xff1a;Partition tolerance&#x…