首页 > 数据库 >Spark_06 SparkSQL补充知识点

Spark_06 SparkSQL补充知识点

时间:2024-07-07 23:30:56浏览次数:13  
标签:知识点 06 string df ss sql Spark csv spark

说明:

本章主要分享Spark自定义函数的使用,catalyst以及sparksql与hive的联动

自定义函数

分类

UDF:一对一关系,输出一行数据得到一行结果,可以自定义

UDAF:聚合函数,多对一关系,输入多行数据经过函数以后输出一行计算结果,通常与groupBy联合使用

UDTF:一对多的关系,输入一行数据经过函数以后输出多行数据(一行变为多行)

使用

自定义函数需要在Spark中注册后使用

两种注册方式:

普通注册: ss.udf.register(注册到spark的函数名, 自定义udf函数名, 自定义函数返回值类型)

  • 既可以在DSL方法中使用, 也可以在sql语句中使用

# UDF(user  defined  function) 自定义函数
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import re

ss = SparkSession.builder.getOrCreate()

# 读取学生数据
df_csv = ss.read.csv('hdfs://node1:8020/data/stu.csv', sep=',',
                     schema='name string,age int,gender string,phone string,email string,city string,address string')
df_csv.show()

def func(email):
    # 接受参数可以定义多个,根据需要处理的字段进行定义
    # 每一次接收一行中的一个指定字段内容
    print(email)
    # 正则表达式匹配, 三个分组, 通过分组获取需要的信息
    r = re.match('(\w+)@(\w+)[.](\w+)', email)
    # 获取第一组数据, name
    name = r.group(1)
    # 获取第二组数据, company
    company = r.group(2)
    # 返回name和company的列表
    return [name, company]


# 自定义udf函数注册到spark
# 第一个参数  注册到spark的函数名
# 第二个参数  自定义的函数名
# 第三个参数  指定函数返回值的类型, 默认字符串类型
# ArrayType(StringType()): 在spark中列表类型定义成数组类型, 数组中元素值类型也需要指定
em_func = ss.udf.register('em_func', func, returnType=ArrayType(StringType()))

df_res = df_csv.select(em_func('email')[0].alias('name'),em_func('email')[1].alias('company'))
df_res.show()

df_csv.createTempView('stu')
df_res2 = ss.sql('select em_func(email)[0] as name,em_func(email)[1] as company from stu')
df_res2.show()

装饰器注册: @udf(返回值类型)

  • 装饰器函数可以没有参数, 默认返回值类型是 StringType() @udf

  • 只能在DSL方法中使用

# UDF(user  define  function) 自定义函数
from pyspark.sql import SparkSession,functions as F
from pyspark.sql.types import *
import re

ss = SparkSession.builder.getOrCreate()

# 读取学生数据
df_csv = ss.read.csv('hdfs://node1:8020/data/stu.csv', sep=',',
                     schema='name string,age int,gender string,phone string,email string,city string,address string')
df_csv.show()

@F.udf(returnType=ArrayType(StringType()))

def func2(address):
    res = address.split(' ')
    return res


df_res = df_csv.select(func2('address')[0].alias('detail_address'), func2('address')[1].alias('code'))
df_res.show()

Spark&Hive的交互操作

明确

python代码方式操作的是Dataframe数据(row和schema)

SQL工具操作 row数据保存在hdfs上 schema 通过metastore保存在mysql上

使用纯sql进行数据的计算 spark on hive(把hive的metastore服务拿过来给spark做元数据管理)

SparkSQL使用方式

交互式开发

流程:先启动hive的metastore服务,在启动sparksql

nohup hive --service metastore &

spark-sql

spark-sql --conf spark.sql.warehouse.dir=hdfs://node1:8020/user/hive/warehouse

spark-sql --master yarn --name spark_on_hive

脚本式开发

from pyspark.sql import SparkSession

# 创建SparkSession对象
ss = SparkSession.builder. \
    config('spark.sql.warehouse.dir', 'hdfs://192.168.88.100:8020/user/hive/warehouse'). \
    enableHiveSupport(). \
    getOrCreate()


# 编写sql语句
df = ss.sql('show databases;')
df.show()
# 创建数据库
ss.sql('create database if not exists itheima;')
df.show()
# 创建数据表
ss.sql('create table if not exists itheima.tb1(id int,name string,gender string,age int);')

SparkSQL引擎-catalyst

概念

catalyst是spark sql的调度核心,遵循传统数据库查询解析步骤,对sql进行解析,转换为逻辑查询计划,物理查询计划,最终转化为Spark的DAG后再执行

spark sql语句通过catalyst转化成最终执行的rdd代码进行执行

组件介绍

catalyst-Parser

将SQL语句解析为语法树(AST),也就是未解析的逻辑查询计划。Parser简单来说是将SQL字符串切分成一个一个Token,再根据一定语义规则解析为一棵语法树。(ANTLR实现)

catalyst-Analyzer

对逻辑查询计划进行属性和关系关联检验,也就是通过定义的一系列规则将未解析的逻辑查询计划借助catalog去解析,如将之前提到的未解析的逻辑查询计划转换成解析后的逻辑查询计划。(再次遍历整个语法树,对树上的每个节点进行数据类型绑定以及函数绑定)

catalyst-Optimizer

通过逻辑查询优化将逻辑查询计划转化为优化的逻辑查询计划,优化器是整个Catalyst的核心。

catalyst-QueryPlanner

将逻辑查询计划转换为物理查询计划,调整数据分布,最后将物理查询计划转换为执行计划进入Spark执行任务

标签:知识点,06,string,df,ss,sql,Spark,csv,spark
From: https://blog.csdn.net/a666b777/article/details/140253497

相关文章

  • 前端react入门day06-ReactRouter
    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)目录什么是前端路由创建路由开发环境快速开始抽象路由模块路由导航什么是路由导航声明式导航编程式导航导航传参嵌套路由配置什么是嵌套路由嵌套路由配置默认二级路由404路由配......
  • P1068 [NOIP2009 普及组] 分数线划定【排序】
    [NOIP2009普及组]分数线划定题目描述世博会志愿者的选拔工作正在A市如火如荼的进行。为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的150......
  • Spark24June
    CommentonProblems2024March(Spark.md)本部分是从古老文档Spark.md里摘录的,其余的部分过于像流水账,就不贴了原属于三月的部分下午考题P2573[SCOI2012]滑雪注意到题目是求一个特殊有向图的最小生成树。考虑Prim与Kruskal算法的精髓,实际上是考察了所有可能扩大......
  • Spark Special_杨宁远 杂题分析.md
    SparkSpecial图论_杨宁远杂题分析Date:2024-07-03Preface本文基于杨宁远@ynycoding的课件与题单,对省选/NOIP阶段图论的建模方法和解题策略进行总结,以及本阶段常用方法、模型和Trick。A.[AGC056C]0/1Balanced[AGC056C]01Balanced-洛谷|计算机科学教育新生态(......
  • 软考:软件设计师 知识点整理 1
    一.计算机组成与体系结构1.数据的表示(1)进制转换进制数码基数位权十进制(D)0,1,2,3,4,5,6,7,8,910二进制(B)0,12十六进制(H)0~9,A,B,C,D,E,F16按权展开法:二进制10100.01=1× +0+1×  +0+0+0+1× 七进制604.01=6×  +0+4×  +0+1× 其......
  • [lnsyoj285/luoguP2596/ZJOI2006]书架
    题意维护一个长度为\(n\)的序列\(a\),进行\(m\)次操作,操作包括:将\(x\)放置于序列开头;将\(x\)放置于序列末尾;将\(x\)与其前驱/后继交换;查询\(x\)的下标\(-1\);查询下标为\(x\)的数sol维护序列,可以使用线段树或平衡树,本题使用平衡树更为简便。介于已经学习......
  • 2024暑假南京外国语学校c++集训 20240706 测试(J/S-)
    A笔记本电脑第一题没啥好说的了点击查看代码#include<bits/stdc++.h>usingnamespacestd;intn;set<int>t;pair<int,int>arr[100009];intmain(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n; for(inti=1;i<=n;i++) { cin>>......
  • KubeSphere 社区双周报|2024.06.21-07.04
    KubeSphere社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过commit的贡献者,并对近期重要的PR进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。本次双周报涵盖时间为:2024.06.21-07.04。贡献者名单新晋KubeSpherecontribu......
  • 06.函数
    Go语言中的函数是代码组织和复用的基础,函数的定义和调用非常简单明了。下面是Go语言中函数的基础语法和一些关键概念:函数的定义在Go语言中,函数的定义包括函数名、参数列表、返回值类型和函数体。语法格式如下:func函数名(参数列表)返回值类型{函数体} 示......
  • Django考试系统 毕业设计-附源码10638
    摘 要本论文主要论述了如何使用python语言、Django框架开发一个考试系统,本系统将严格按照软件开发流程,进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述该系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计......