SparkSQL案例

news2024/12/22 6:56:26

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, BooleanType

os.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 None


def 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 - year
    if now.month < month:
        age -= 1
    elif now.month == month and now.day < day:
        age -= 1
    return age


def 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) era
        from 
            mydb.users
        where
            idcard_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 distinct
            gender,
            count(*) over(partition by gender) / count(*) over() rate
        from
            mydb.filtered_users
        where era = '00';
    """).show()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux环境下使用tomcat+nginx部署若依项目

Linux Tomcat MySQL Java 是构建动态网站系统的完美解决方案之一&#xff0c;具有免费、高 效、扩展性强且资源消耗低等优良特性。 Java Web 凭借其优秀的开发框架和良好的生态被广 泛应用于社会各行业的信息化系统构建。 本实验以若依管理系统&#xff08; http://ruo…

.NET重点

B/S C/S什么语言 B/S&#xff1a; 浏览器端&#xff1a;JavaScript&#xff0c;HTML&#xff0c;CSS 服务器端&#xff1a;ASP&#xff08;.NET&#xff09;PHP/JSP 优势&#xff1a;维护方便&#xff0c;易于升级和扩展 劣势&#xff1a;服务器负担沉重 C/S java/.NET/…

前端HTTP协议传输以及背后的原理总结

一、HTTP在前端的地位 HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础&#xff0c;同时&#xff0c;也是一种客户端—服务器&#xff08;client-server&#xff09;协议&#xff0c;也就是说&#xff0c;请求是由接受方——通常是…

城市应急指挥系统

城市应急指挥系统的重要性 随着现代化城市的高速发展&#xff0c;我们面临着多种应急突发情景&#xff0c;如自然灾害、事故灾难、公共卫生事件以及社会安全事件等。这些事件对城市的安全稳定构成严重威胁&#xff0c;因此&#xff0c;建立一套高效、全面的城市应急指挥系统显…

【软考高级】系统架构设计师复习笔记-精华版

文章目录 前言0 系统架构设计师0.1 考架构还是考系分0.2 架构核心知识0.3 架构教材变化 1 计算机操作系统1.1 cpu 组成1.2 内核的五大功能1.3 流水线技术1.4 段页式存储1.5 I/O 软件1.6 文件管理1.7 系统工程相关 2 嵌入式2.1 嵌入式技术2.2 板级支持包&#xff08;BSP&#xf…

NSDT 3DConvert:高效实现大模型文件在线预览与转换

NSDT 3DConvert 作为一个 WebGL 展示平台&#xff0c;能够实现多种模型格式免费在线预览&#xff0c;并支持大于1GB的OBJ、STL、GLTF、点云等模型进行在线查看与交互&#xff0c;这在3D模型展示领域是一个相当强大的功能。 平台特点 多格式支持 NSDT 3DConvert兼容多种3D模型…

STL 剖析

STL 六大组件 「STL 六大组件的交互关系」 Container 通过 Allocator 取得数据储存空间Algorithm 通过 Iterator 存取 Container 内容Functor 可以协助 Algorithm 完成不同的策略变化Adapter 可以修饰或套接 Functor、Iterator 配置器(allocator) 配置器&#xff1a;负责空间…

买卖股票的最佳时机 IV - 困难

************* C topic&#xff1a;188. 买卖股票的最佳时机 IV - 力扣&#xff08;LeetCode&#xff09; ************* Stock angin: Still stocks. Intuitively, it feels hard. For once: class Solution { public:int maxProfit(vector<int>& prices) {in…

#{ }和${ } 、参数处理

目录 #{ }和${ } 参数处理 入参-parameterType 使用Map 使用Bean / List<Bean> 使用多参数 Param注解&#xff08;命名参数&#xff09; 出参-resultType 返回Map / List<Map> 返回Map<String,Map> 属性名不一致-resultMap结果映射 #{ }和${ }…

机器学习探索之旅:开启智能预测的新篇章!!! 笔记 ! ! !)

目录 一 . 机器学习基础&#xff1a; 1. 什么是机器学习&#xff1a; Langley&#xff08;1996&#xff09;的定义&#xff1a; Tom Mitchell&#xff08;1997&#xff09;的定义&#xff1a; 冷雨泉&#xff08;等&#xff09;的观点&#xff1a; 2. 机器学习与人工智能…

【RAII | 设计模式】C++智能指针,内存管理与设计模式

前言 nav2系列教材&#xff0c;yolov11部署,系统迁移教程我会放到年后一起更新&#xff0c;最近年末手头事情多&#xff0c;还请大家多多谅解。 上一节我们讲述了C移动语义相关的知识&#xff0c;本期我们来看看C中常用的几种智能指针&#xff0c;并看看他们在设计模式中的运…

基于单片机的病房呼叫系统设计

摘 要&#xff1a; 文章基于 51 系列的单片机设计的病房呼叫系统 。 在以 AT89C51 单片机为核心&#xff0c;以 74HC573 锁存器 、数码管显示模块、 矩阵按键模块等为辅组成的&#xff0c;按键分布在各个病床的床头&#xff0c;可以节约接口资源&#xff0c;当按下按键&a…

编译原理复习---目标代码生成

适用于电子科技大学编译原理期末考试复习。 1. 目标代码 是目标机器的汇编代码或机器码&#xff0c;在本课程中指的是类似于汇编代码的一种形式&#xff0c;由一条条的指令构成目标代码。 抽象机指令格式&#xff1a;OP 目的操作数&#xff0c;源操作数。 我们要做的&…

Redis数据对象

基本结构图 key和value指向的是redisObject对象 type&#xff1a;标识该对象用的是什么类型&#xff08;String、List Redis数据结构 SDS SDS有4个属性&#xff1a; len&#xff1a;记录了字符串长度&#xff0c;因此获取字符串长度的时候时间复杂度O&#xff08;1&#xff…

Gale-Shapley算法

一. 设计目的 盖尔-沙普利算法&#xff08;Gale-Shapley算法&#xff09;的设计目的是为了解决稳定匹配问题&#xff0c;即在给定一组男性和女性的偏好列表的情况下&#xff0c;找到一个稳定的匹配。这里的“稳定”指的是不存在任何一对男性和女性&#xff0c;他们彼此都比当前…

JWT令牌与微服务

1. 什么是JWT JWT&#xff08;JSON Web Token&#xff09;是一种开放标准(RFC 7519)&#xff0c;它定义了一种紧凑且自包含的方式&#xff0c;用于作为JSON对象在各方之间安全地传输信息。JWT通常用于身份验证和信息交换。 以下是JWT的一些关键特性&#xff1a; 紧凑&#xff…

视频点播系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

docker部署Melody开源音乐管理工具

Melody是一款非常实用的开源音乐管理工具。它不仅功能强大、操作简便&#xff0c;还支持多平台检索和一键下载/上传功能。更重要的是&#xff0c;它还支持一键“解锁”无法播放的歌曲和多端适配。如果你也是音乐爱好者&#xff0c;不妨试试Melody&#xff0c;让你的音乐生活更加…

问题小记-达梦数据库报错“字符串转换出错”处理

最近遇到一个达梦数据库报错“-6111: 字符串转换出错”的问题&#xff0c;这个问题主要是涉及到一条sql语句的执行&#xff0c;在此分享下这个报错的处理过程。 问题表现为&#xff1a;一样的表结构和数据&#xff0c;执行相同的SQL&#xff0c;在Oracle数据库中执行正常&…

day4:tomcat—maven-jdk

一&#xff0c;java项目部署过程 编译&#xff1a;使用javac命令将.java源文件编译成.class宇节码文件打包&#xff1a;使用工具如maven或Gradle将项目的依赖、资源和编译后的字节码打包成一个分发格式&#xff0c;如.jar文件&#xff0c;或者.war文件(用于web应用&#xff09…