SparkSQL案例

SparkSQL案例

**案例描述:**某系统存储有用户的基本信息,包括用户的姓名、身份证号、手机号码。

数据集: 有用得着的评论或私信即可

需求分析:

  • 将表中的数据进行过滤,只保留 80 后、90 后、00 后的用户信息,并存入新的 Hive 分区表中,以年代为分区字段。
  • 查询过滤后的表中,90 后的占比。
  • 查询过滤后的表中,各个省份的人数及占比。
  • 查询 00 后中性别的占比。

Hive建表语句

# 用户基础信息表
create table if not exists users(username string,idcard string,phone string
)
row format delimited
fields terminated by ','
lines terminated by '\n';# 身份证地址信息对照表
create table if not exists idcard_info(idcard string,province string,city string,country string
)
row format delimited
fields terminated by ','
lines terminated by '\n';# 新的分区表准备
create table if not exists filtered_users(username string,idcard string,phone string,birthday string,age int,gender string,province string,city string,country string
)
partitioned by (era string)
row format delimited
fields terminated by ','
lines terminated by '\n';
"""
案例描述: 在某项目中有用户信息表、身份证地址对照表用户信息表 users:- 用户名 username- 身份证号 idcard- 手机号 phone身份证地址对照表 idcard_info:- 身份证号 idcard- 省份 province- 市 city- 区县 country- 将表中的数据进行过滤,只保留 80 后、90 后、00 后的用户信息,并存入新的 Hive 分区表中,以年代为分区字段。
- 查询过滤后的表中,每个年龄段的占比。
- 查询过滤后的表中,各个省份的人数及占比。
- 查询 00 后中女性的占比。
"""import os
import re
import datetime
from pyspark.sql import SparkSession
from pyspark.sql.types import IntegerType, StringType, BooleanTypeos.environ.setdefault("HADOOP_USER_NAME", "root")def idcard_checker(idcard: str) -> bool:"""检查一个身份证号是否合法:param idcard: 身份证号:return: 检验结果"""check_res = re.fullmatch(r'(\d{6})'r'(?P<year>(19|20)\d{2})(?P<month>0[1-9]|1[0-2])(?P<day>[012][0-9]|10|20|30|31)\d{2}'r'(?P<gender>\d)[0-9xX]',idcard)return check_res is not Nonedef get_year(idcard: str) -> int:"""从一个身份证中查询年:param idcard: 身份证号:return: 年"""return int(idcard[6:10])def get_month(idcard: str) -> int:"""从一个身份证中查询月:param idcard: 身份证号:return: 月"""return int(idcard[10:12])def get_day(idcard: str) -> int:"""从一个身份证中查询日:param idcard: 身份证号:return: 日"""return int(idcard[12:14])def get_birthday(idcard: str) -> str:"""从一个身份证中查询生日:param idcard: 身份证号:return: 生日"""return "-".join([idcard[6:10], idcard[10:12], idcard[12:14]])def get_gender(idcard: str) -> str:"""从一个身份证中查询性别:param idcard: 身份证号:return: 性别"""return '男' if int(idcard[-2]) % 2 != 0 else '女'def get_era(idcard: str) -> str:"""从一个身份证中查询年代:param idcard: 身份证号:return: 年代"""return f"{idcard[8]}0"def get_age(idcard: str) -> int:"""从一个身份证中查询年龄:param idcard: 身份证号:return: 年龄"""year = get_year(idcard)month = get_month(idcard)day = get_month(idcard)now = datetime.datetime.now()age = now.year - yearif now.month < month:age -= 1elif now.month == month and now.day < day:age -= 1return agedef get_addr(idcard: str) -> str:"""从一个身份证中查询地址信息:param idcard: 身份证号:return: 地址信息"""return idcard[0:6]with SparkSession\.builder.master("local[*]")\.appName("exercise")\.enableHiveSupport()\.config("hive.exec.dynamic.partition.mode", "nonstrict")\.getOrCreate() as spark:# 注册 UDF 函数spark.udf.register("get_year", get_year, IntegerType())spark.udf.register("get_month", get_month, IntegerType())spark.udf.register("get_day", get_day, IntegerType())spark.udf.register("get_gender", get_gender, StringType())spark.udf.register("get_age", get_age, IntegerType())spark.udf.register("get_era", get_era, StringType())spark.udf.register("get_birthday", get_birthday, StringType())spark.udf.register("idcard_checker", idcard_checker, BooleanType())spark.udf.register("get_addr", get_addr, StringType())# 将身份证中的信息都提取出来spark.sql("""select username,idcard,phone,get_birthday(idcard) birthday,get_age(idcard) age,get_gender(idcard) gender,get_era(idcard) erafrom mydb.userswhereidcard_checker(idcard) == true""").createTempView("tmp_user")# 连接上地址信息进行查询,并将结果写出到表中# spark.sql("""#     insert into mydb.filtered_users partition(era)#     select#         username,#         tmp_user.idcard,#         phone,#         birthday,#         age,#         gender,#         province,#         city,#         country,#         era#     from#         tmp_user#     join#         mydb.idcard_info#     on#         mydb.idcard_info.idcard == get_addr(tmp_user.idcard)#     where#         tmp_user.era == 10 or tmp_user.era == 80 or tmp_user.era == 90 or tmp_user.era == 00# """)# - 查询过滤后的表中,每个年龄段的占比。# spark.sql("""#     select distinct#         era,#         count(*) over(partition by era) / count(*) over() rate#     from#         mydb.filtered_users# """).show()# - 查询过滤后的表中,各个省份的人数及占比。# spark.sql("""#     select distinct#         province,#         count(*) over(partition by province) / count(*) over() rate#     from#         mydb.filtered_users#     order by#         rate desc# """).show(50)# - 查询00后中男女的占比。spark.sql("""select distinctgender,count(*) over(partition by gender) / count(*) over() ratefrommydb.filtered_userswhere era = '00';""").show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/493095.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity 圆形循环复用滚动列表

一.在上一篇垂直循环复用滚动列表的基础上&#xff0c;扩展延申了圆形循环复用滚动列表。实现此效果需要导入垂直循环复用滚动列表里面的类。 1.基础类 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using …

【前后端】HTTP网络传输协议

近期更新完毕&#xff0c;建议关注、收藏&#xff01; http请求 URL 严格意义上应该是URI http or https http不加密不安全&#xff1b;https加密协议&#xff08;公网使用&#xff09; http端口号80 https端口号443GET or POST GET和POST是HTTP请求的两种基本方法. 因为POST需…

基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 &#xff08;完整版代码包含详细中文注释和操作步骤视…

疾风大模型气象系统:精准预报,引领未来

精准预报,引领未来 在当今快速变化的世界中,天气预报已成为日常生活和社会运行中不可或缺的一部分。从规划日常出行到防范极端天气影响,高精准的气象服务正在重新定义我们的生活方式。而在这一领域,疾风大模型气象系统以其卓越的技术实力和领先的预测能力,正引领气象服务…

中间件 redis安装

redis官网地址&#xff1a;Redis - The Real-time Data Platform 环境 CentOS Linux release 7.9.2009 (Core) java version "17.0.12" 2024-07-16 LTS 1、通过压缩包安装redis 1&#xff0c;远程下载redis压缩包&#xff0c;或去官网下载&#xff1a;Downloads …

rfid标签打印开发指导

使用java连接斑马打印机&#xff0c;开发rfid标签打印功能 1.引用斑马打印机的SDKjar包 ZSDK_API.jar 将这个jar文件放到项目的lib目录下&#xff0c;没有就新建一个。 然后点击 File–Project Sreucture–Modules 点击加号 选择对应jar包即可 2.代码开发 1.打印机连接地址…

【笔记】深度学习模型评估指标

推荐链接&#xff1a; &#xff08;0&#xff09;多分类器的评价指标 &#xff08;1&#xff09;泛化误差的评价方法&#xff1a;【机器学习】模型评估与选择&#xff08;留出法、交叉验证法、查全率、查准率、偏差、方差&#xff09; &#xff08;2&#xff09;机器学习&…

【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南

硬件&#xff1a;Apple M4 Pro 16寸 系统&#xff1a; macos Sonoma 15.1.1 Nginx 是一款高性能的 Web 服务器和反向代理服务器&#xff0c;广泛应用于全球各地的网站和企业应用中。本文将详细介绍如何在 macOS 环境下使用 Homebrew 安装、启动、管理以及优化配置 Nginx&#x…

OpenCV 学习记录:首篇

最近在学习机器视觉&#xff0c;希望能通过记录博客的形式来鞭策自己坚持学完&#xff0c;同时也把重要的知识点记录下来供参考学习。 1. OpenCV 介绍与模块组成 什么是 OpenCV&#xff1f; OpenCV (Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软…

git使用和gitlab部署

1.ci,cd,DevOps ci&#xff1a;持续集成&#xff1a;开发的代码集成到代码仓库 cd&#xff1a;持续交互&#xff1a;从代码仓库拉取代码到部署到测试环境 cd&#xff1a;持续部署&#xff1a;从代码仓库拉取代码到部署到生产环境 DevOps:开发写完的代码自动集成&#xff0c…

数据结构:B树与B+树

工具 数据结构与算法可视化在线演示 m阶 B树有以下特点&#xff1a; B-树&#xff0c;有时又写为B_树&#xff08;其中的-或者_只是连字符&#xff0c;并不读作 B减树&#xff09;&#xff0c;一颗 m 阶(或度)的 B-树&#xff0c;或者本身是空树&#xff0c;否则必须满足以下…

CSDN数据大屏可视化【开源】

项目简介 本次基于版本3 开源 版本3开源地址&#xff1a;https://github.com/nangongchengfeng/CsdnBlogBoard.git 版本1开源地址&#xff1a;https://github.com/nangongchengfeng/CSDash.git 这是一个基于 Python 的 CSDN 博客数据可视化看板项目&#xff0c;通过爬虫采…

YOLOv8全解析:高效、精准的目标检测新时代——创新架构与性能提升

目录 前言 一、模型介绍 二、网络结构 Backbone改进 特征增强网络(neck) 检测头(head) 其它部分 三、Loss计算 四、性能表现 五、YOLOv8使用详解 添加模型 其它部分 创建数据集 数据标注 模型训练 模型预测 六、YOLOv8总结 前言 YOLO&#xff08;You Only Lo…

重拾设计模式--模板方法模式

文章目录 一、模板方法模式概述二、模板方法模式UML图三、优点1代码复用性高2可维护性好3扩展性强 四、缺点五、使用场景六、C 代码示例1七、 C 代码示例2 一、模板方法模式概述 定义&#xff1a;定义一个操作中的算法骨架&#xff0c;而降一些步骤延迟到子类中。模板方法使得…

林子雨-大数据课程实验报告(一)

实验一&#xff1a;熟悉常用的Linux操作和Hadoop操作 一、实验目的 Hadoop运行在Linux系统上&#xff0c;因此&#xff0c;需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作和Hadoop操作&#xff0c;为顺利开展后续其他实验奠定基础。 二、实验平台 操作系统…

时间序列异常值检测方法

文章目录 一、基于统计的方法1.1、标准差1.2、箱线图1.3、Z-Score法 二、基于机器学习算法的方法2.1、K-NN2.2、孤立森林 三、基于密度的方法3.1、LOF3.2、DBSCAN密度聚类 时间序列相关参考文章&#xff1a; 时间序列预测算法—ARIMA 时间序列预测算法—Prophet 时间序列分类任…

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Moretl开箱即用日志采集

永久免费: 至Gitee下载 使用教程: Moretl使用说明 使用咨询: 用途 定时全量或增量采集工控机,电脑文件或日志. 优势 开箱即用: 解压直接运行.不需额外下载.管理设备: 后台统一管理客户端.无人值守: 客户端自启动,自更新.稳定安全: 架构简单,兼容性好,通过授权控制访问. 架…

Go框架比较:goframe、beego、iris和gin

由于工作需要&#xff0c;这些年来也接触了不少的开发框架&#xff0c;Golang的开发框架比较多&#xff0c;不过基本都是Web"框架"为主。这里稍微打了个引号&#xff0c;因为大部分"框架"从设计和功能定位上来讲&#xff0c;充其量都只能算是一个组件&…

DB-GPT 智谱在线模型配置

LLM_MODELzhipu_proxyllm PROXY_SERVER_URLhttps://open.bigmodel.cn/api/paas/v4/chat/completions ZHIPU_MODEL_VERSIONglm-4 ZHIPU_PROXY_API_KEY70e8ec7113882ff5478fcecaa47522479.ExY2LyjcvWmqrTAf