spark如何使用窗口函数

481 阅读2分钟

「这是我参与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()

\