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, 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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker介绍、安装、namespace、cgroup、镜像-Dya 01

0. 容器简介 从生活上来说&#xff0c;容器是一种工具&#xff0c;可以装东西的工具&#xff0c;如衣柜、背包、行李箱等等。 从IT技术方面来说&#xff0c;容器是一种全新的虚拟化技术&#xff0c;它提高了硬件资源利用率&#xff0c;结合k8s还可以让企业业务快速横向扩容、业…

Kube-state-metrics 可观测性最佳实践

Kube-state-metrics 介绍 Kube-state-metrics 是 Kubernetes 生态系统中的一个开源项目&#xff0c;主要用来收集和报告集群中各种资源的实时状态信息。 工作原理 Kube-state-metrics 连接到 Kubernetes API 服务器&#xff0c;并公开一个 HTTP 端点&#xff0c;提供集群中各…

Pycharm配置Python开发环境

Pycharm配置Python开发环境 在之前的文章中,安装好了Pyhton和Pycharm。 打开Pycharm,如下图 配置完成之后,如下图所示:

scala中模式匹配的应用

package test34object test6 {case class Person(name:String)case class Student(name:String, className:String)// match case 能根据 类名和属性的信息&#xff0c;匹配到对应的类// 注意&#xff1a;// 1 匹配的时候&#xff0c;case class的属性个数要对上// 2 属性名不需…

PyQt5学习笔记

P95 绝对布局 绝对布局&#xff0c;使用move方法&#xff0c;操作坐标来控件控件的位置。 import sys from PyQt5.QtWidgets import *绝对布局&#xff0c;使用move方法&#xff0c;操作坐标来控件控件的位置。class MyWin(QWidget):def __init__(self):super().__init__()#…

Python3.13安装和配置

Python3.13安装和配置 一、Python的下载 点击下面的下载链接,下载需要的版本。以3.13版本为例。如下图所示: 3.13.0下载地址(windows)3.13.0下载地址(windows) 二、安装 下载完成后,双击安装文件。 <

探索Linux中的Zombie僵死进程

文章目录 探索Linux中的Zombie僵死进程什么是Zombie僵死进程&#xff1f;僵死进程的产生原因如何识别僵死进程&#xff1f;如何清理僵死进程&#xff1f;僵死进程对系统的影响总结 探索Linux中的Zombie僵死进程 在Linux系统中&#xff0c;进程管理是一个非常重要的主题&#x…

win11 C盘出现感叹号解决方法

出现感叹号&#xff0c;原因是对C盘进行了BitLocker驱动器加密操作。如果想去除感叹号&#xff0c;对C盘进行BitLocker解密即可。 步骤如下&#xff1a; 1.点击Windows搜索框 2.搜索框内输入 系统 3.按下回车&#xff0c;进入系统界面 4.点击隐私和安全性 点击BitLocker驱…

多个Echart遍历生成 / 词图云

echart官网 安装 如果版本报错推荐安装以下版本 npm install echarts4.8.0 --savenpm uninstall echarts//这个是卸载命令以下安装成功后是局部引入:多个Echart遍历生成 vue3echart单个页面多个图表循环渲染展示:<template><div class"main"><div …

Element plus 下拉框组件选中一个选项后显示的是 value 而不是 label

最近刚进行 Vue3 Element plus 项目实践&#xff0c;在进行表单二次封装的时候&#xff0c;表单元素 select 下拉框组件选中一个选项后显示的是 value 而不是 label&#xff0c;下面上代码&#xff1a; 原来的写法&#xff1a; <el-selectv-if"v.type select"…

中小学教室多媒体电脑安全登录解决方案

中小学教室多媒体电脑面临学生随意登录的问题&#xff0c;主要涉及到设备使用、网络安全、教学秩序等多个方面。以下是对这一问题的详细分析&#xff1a; 一、设备使用问题 1. 设备损坏风险 学生随意登录可能导致多媒体电脑设备过度使用&#xff0c;增加设备损坏的风险。不当…

Python从0到100(七十八):神经网络--从0开始搭建全连接网络和CNN网络

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

Gitlab 数据备份全攻略:命令、方法与注意事项

文章目录 1、备份命令2、备份目录名称说明3、手工备份配置文件3.1 备份配置文件3.2 备份ssh文件 4、备份注意事项4.1 停止puma和sicdekiq组件4.2 copy策略需要更多磁盘空间 5、数据备份方法5.1 docker命令备份5.2 kubectl命令备份5.3 参数说明5.4、选择性备份5.5、非tar备份5.6…

设计模式12:状态模式

系列总链接&#xff1a;《大话设计模式》学习记录_net 大话设计-CSDN博客 参考&#xff1a;设计模式之状态模式 (C 实现)_设计模式的状态模式实现-CSDN博客 1.概述 状态模式允许一个对象在其内部状态改变时改变其行为。对象看起来像是改变了其类。使用状态模式可以将状态的相…

如何使用 Wireshark:从入门到进阶的网络分析工具

简述 Wireshark 是全球最受欢迎的网络协议分析工具&#xff0c;它帮助用户捕获和分析网络流量&#xff0c;诊断网络问题&#xff0c;排查安全漏洞&#xff0c;甚至恢复丢失的数据文件。作为一名网络工程师、安全专家、甚至是开发者&#xff0c;Wireshark 都是你必须掌握的工具…

100个问题学langchain入门(2/10)

问题 11 在 LangChain 中&#xff0c;如何将文档转化为向量以存储到 Vectorstore 中&#xff1f;具体使用了哪些技术或工具&#xff1f; 在 LangChain 中&#xff0c;将文档转化为向量以存储到 Vectorstore 中&#xff0c;主要通过以下步骤和技术完成&#xff1a; 转化流程&a…

C#winform引入DLL,DLL嵌入exe

C#winform将DLL嵌入exe 1 项目引入DLL1.1 项目-鼠标右击-点击添加引用&#xff1b;1.2 点击“浏览”&#xff1b;1.3 添加选中DLL1.4 勾选引入的DLL&#xff0c;点击“确定”1.5 添加成功后 2 DLL嵌入exe2.1 打开引入DLL属性窗口2.2 将“复制本地”项设为“false”2.3 双击打开…

828华为云征文 | 华为云Flexus云服务器X实例搭建企业内部VPN私有隧道,以实现安全远程办公

VPN虚拟专用网络适用于企业内部人员流动频繁和远程办公的情况&#xff0c;出差员工或在家办公的员工利用当地ISP就可以和企业的VPN网关建立私有的隧道连接。 通过拨入当地的ISP进入Internet再连接企业的VPN网关&#xff0c;在用户和VPN网关之间建立一个安全的“隧道”&#xff…

wxpyton+wxFormBuilder加法运算示例

wxpythonwxFormBuilder加法运算示例 在wxFormBuilder里设计一个窗体&#xff0c;生成如下代码&#xff1a;calc_From.py 放在lib文件夹下面 import gettext import wx import wx.xrc _ gettext.gettext class MyFrame1(wx.Frame):def __init__(self, parent):wx.Frame.__init…

【AI驱动的数据结构:包装类的艺术与科学】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 包装类装箱和拆箱阿里巴巴面试题 包装类 在Java中基本数据类型不是继承来自Object&#xff0c;为了…