当前位置: 首页 > news >正文

PythonSQL应用随笔4——PySpark创建SQL临时表

零、前言

Python中直接跑SQL,可以很好的解决数据导过来导过去的问题,本文方法主要针对大运算量时,如何更好地让Python和SQL打好配合。

工具:Zeppelin
语法:PySpark(Apache Spark的Python API)、SparkSQL
数据库类型:Hive

一、相关方法

  • .createOrReplaceTempView()
    在PySpark中,createOrReplaceTempView是一个用于DataFrame的方法,它允许你将DataFrame的内容注册为一个临时的SQL视图,这样就可以在Spark SQL查询中引用这个视图,就像正常查询常规数仓表一样。
  • .toPandas()
    最终取数结果,以DataFrame形式输出。

二、实例

Zeppelin中编辑器与Jupyter Notebook类似,以代码块形式呈现,只是需要提前指定好代码块的语言,如:%pyspark
日常工作中,库存数据是常见的大数据量取数场景,下述代码以取 sku每天的库存 为例展开。

%pyspark
# 工具包及基础配置(视具体情况进行配置,非本文重点,可略过)
import pandas as pd
from pyspark import SparkConf
from pyspark import SparkContext
from pyspark.sql.types import *
from pyspark.sql import SparkSession
from pyspark.sql import SQLContextspark_conf = SparkConf()
spark_conf.setMaster("local[*]")
spark_conf.setAppName("Test")
spark_conf.set("zeppelin.spark.sql.stacktrace", "true")
spark_conf.set('hive.exec.dynamic.partition.mode', 'nonstrict')
spark_conf.set("spark.sql.execution.arrow.enabled", "true")
spark_conf.set("spark.sql.execution.arrow.fallback.enabled", "true")
spark = SparkSession.builder.config(conf=spark_conf).config("zeppelin.spark.sql.stacktrace", "true").enableHiveSupport().getOrCreate()
%pyspark
# 配置取数参数(省事小技巧,避免重复编码,根据实际情况可配置多个参数)
## 开始、结束日期、品牌、……
start_date = '2024-01-01'
end_date = '2024-01-31'
brand = 'brand01'# sql1:日期维表
tmp_dim_date = '''select date_stringfrom edw.dim_datewhere 1=1and date_string >= '{start_date}'and date_string <= '{end_date}''''.format(start_date=start_date, end_date=end_date)
tmp_dim_date = spark.sql(tmp_dim_date).createOrReplaceTempView('tmp_dim_date') # 创建日期临时表:tmp_dim_date# sql2:商品维表
tmp_dim_sku = '''select brand_name,sku_skfrom edw.dim_skuwhere 1=1and brand_name = '{brand}'group by 1, 2'''.format(brand=brand)
tmp_dim_sku = spark.sql(tmp_dim_sku).createOrReplaceTempView('tmp_dim_sku') # 创建sku临时表:tmp_dim_sku# 最终sql:sku每天的库存
sku_stock = '''select tb0.date_string,tb1.sku_sk,sum(coalesce(tb1.stock_qty, 0)) stock_qty -- 库存量from tmp_dim_date tb0 -- 日期临时表left join edw.stock_zipper tb1 -- 库存拉链表on tb1.date_begin <= tb0.date_string -- 开链时间and tb1.date_end > tb0.date_string -- 闭链时间inner join tmp_dim_sku tb2 -- sku临时表on tb1.sku_sk = tb2.sku_skgroup by 1, 2'''
df_sku_stock = spark.sql(tmp_stock_zipper).toPandas()# 删除临时视图(在不需要时及时做垃圾回收,减少资源占用)
spark.catalog.dropTempView("tmp_dim_stockorg")
spark.catalog.dropTempView("tmp_dim_sku")

至此,sku天维度库存数据已取出,实际应用常见可能比本案例复杂许多,故临时表的方法才更重要,一方面能理清楚取数代码的结构,一方面也提高代码性能。

三、总结

NULL

[手动狗头]

本文简短,也没总结的必要,那便在此祝各位新年快乐吧(bushi

http://www.lryc.cn/news/373723.html

相关文章:

  • C# OpenCvSharp 矩阵计算-determinant、trace、eigen、calcCovarMatrix、solve
  • 知识普及:什么是边缘计算(Edge Computing)?
  • 大型企业IT基础架构和应用运维体系
  • 【源码】16国语言交易所源码/币币交易+期权交易+秒合约交易+永续合约+交割合约+新币申购+投资理财/手机端uniapp纯源码+PC纯源码+后端PHP
  • word空白页删除不了怎么办?
  • Java web应用性能分析之【prometheus+Grafana监控springboot服务和服务器监控】
  • JavaEE——声明式事务管理案例:实现用户登录
  • 解决用Three.js实现嘴型和语音同步时只能播放部分部位的问题 Three.js同时渲染播放多个组件变形动画的方法
  • 阅读笔记:明朝那些事儿太监弄乱的王朝
  • 算法第六天:力扣第977题有序数组的平方
  • 设计模式学习(二)工厂模式——工厂方法模式
  • TCP与UDP案例
  • Adaboost集成学习 | Matlab实现基于CNN-LSTM-Adaboost集成学习时间序列预测(股票价格预测)
  • 你焦虑了吗
  • 一键分析Bulk转录组数据
  • Django DetailView视图
  • openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写
  • typescript-泛型
  • 应急响应 | 基本技能 | 01-系统排查
  • 用c语言实现通讯录
  • AI大模型技术揭秘-参数,Token,上下文和温度
  • 攻防世界-fakebook题目__详解
  • Ubuntu 18.04下普通用户的一次提权过程
  • 接口和抽象类:如何使用普通类模拟接口和抽象类
  • 【文档智能】实践:基于Yolo三行代码极简的训练一个版式分析模型
  • 聚观早报 | 深蓝G318价格发布;比亚迪方程豹豹3官图发布
  • 如何实现内网穿透?快解析-免费内网穿透工具
  • 【python-AI篇】人工智能技能树思维导图
  • Vue的computed大致细节
  • 第5章:模型预测控制(MPC)的代码实现