Python&SQL应用随笔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 复制代码
%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 SQLContext

spark_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 复制代码
%pyspark
# 配置取数参数(省事小技巧,避免重复编码,根据实际情况可配置多个参数)
## 开始、结束日期、品牌、......
start_date = '2024-01-01'
end_date = '2024-01-31'
brand = 'brand01'

# sql1:日期维表
tmp_dim_date = '''
	select date_string
	from edw.dim_date
	where 1=1
		and 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_sk
	from edw.dim_sku
	where 1=1
		and 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_sk
	group 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

相关推荐
爱吃香菜的初学者5 分钟前
十六.Linux——多线程(2)
linux·运维·开发语言
jeo陽18 分钟前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
暖核37 分钟前
kubeadm 集群运维:Worker 节点下线删除、整套集群销毁重建指南
运维·开发语言·php
l1t38 分钟前
DeepSeek总结的 DuckDB 2.0 中更简洁的变量语法
数据库·sql
尼给路达哟1 小时前
node(koa)和python(fastapi)面试
python·面试·fastapi
tachibana21 小时前
Go 语言里的 Context 是什么?
开发语言·后端·golang·go·语言
天桥下的卖艺者1 小时前
R语言使用ggcube包轻松绘制文章中的各类3D图形
开发语言·3d·r语言
曲径海盗2 小时前
【Python 学习第 32 天】字符串基础
python·学习笔记·编程入门
田里的水稻2 小时前
PyTorch_torchvision---数据集下载\TensorBoard可视化
人工智能·pytorch·python·深度学习·机器学习
程序员正茂2 小时前
Win11使用自定义训练集训练ncnn模型
python·yolo·图像识别·移动端·ncnn