「这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」
1 spark如何使用窗口函数
开窗函数格式:
分析函数 over(partition by xxx order by xxx [desc|asc])
常见的分析函数:
1) 可以和 row_number() rank() dense_rank() ntile(N) 配合开窗函数
2) 聚合函数(sum(),max()....) 配合开窗函数
3) 可以和 lead lag first last_value .... 配合开窗函数
如何使用:
-
通过SQL的方式来使用:
- 与在hive中书写格式几乎没有太大的区别
第一步: 需要将资料中提供的sqldata/cookie.txt 文件拷贝到 sparkSQL的data目录下
第二步: 编写代码 使用窗口函数
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import os
# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"
if __name__ == '__main__':
print("测试如何使用窗口函数_SQL方式")
# 1) 创建sparkSession对象:
spark = SparkSession.builder.master("local[*]").appName("wordcount").getOrCreate()
# 2) 读取外部数据源数据
schema = StructType().add("cookie",StringType()).add("timeStr",StringType()).add("pv",IntegerType())
df = spark.read.format("csv").schema(schema=schema).load(
"file:///export/data/workspace/_03_pyspark_sql/data/cookie.txt")
df.createTempView("cookie_tab")
# 3) 处理数据
spark.sql("""
select
cookie,
timeStr,
pv,
row_number() over(partition by cookie order by pv) as rank1,
rank() over(partition by cookie order by pv) as rank2,
sum(pv) over(partition by cookie order by pv) as rank2
from cookie_tab
""").show()
- 尝试使用DSL方式实现窗口函数:
from pyspark import SparkContext, SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.types import *
import os
# 目的: 锁定远端操作环境, 避免存在多个版本环境的问题
os.environ["SPARK_HOME"] = "/export/server/spark"
os.environ["PYSPARK_PYTHON"] = "/root/anaconda3/bin/python"
os.environ["PYSPARK_DRIVER_PYTHON"] = "/root/anaconda3/bin/python"
if __name__ == '__main__':
print("测试如何使用窗口函数_DSL方式")
# 1) 创建sparkSession对象:
spark = SparkSession.builder.master("local[*]").appName("wordcount").getOrCreate()
# 2) 读取外部数据源数据
schema = StructType().add("cookie",StringType()).add("timeStr",StringType()).add("pv",IntegerType())
df = spark.read.format("csv").schema(schema=schema).load(
"file:///export/data/workspace/_03_pyspark_sql/data/cookie.txt")
# 3) 处理数据
import pyspark.sql.functions as F
from pyspark.sql import Window as win
df.select(
df['cookie'],
df['timeStr'],
df['pv'],
F.row_number().over(win.partitionBy('cookie').orderBy(F.desc('pv'))).name("rank1"),
F.count('pv').over(win.partitionBy('cookie').orderBy(F.desc('pv'))).name("rank2")
).show()
\