下面我将详细讲解如何使用 Spark SQL 分别通过 SQL 模式和 DSL(Domain Specific Language)模式实现 WordCount 功能。

WordCount 是大数据处理中的经典案例,主要功能是统计文本中每个单词出现的次数。

准备工作

首先需要初始化 SparkSession,这是 Spark SQL 的入口点:

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, split, col# 创建 SparkSession
spark = SparkSession.builder \.appName("WordCountExample") \.master("local[*]")  # 本地模式运行,生产环境可去掉.getOrCreate()

示例数据

我们使用一段简单的文本作为示例数据:

# 创建包含文本数据的 DataFrame
data = [("Hello Spark SQL",), ("Hello DSL",), ("Spark SQL is powerful",), ("DSL is flexible",)]
df = spark.createDataFrame(data, ["sentence"])

方法一:SQL 模式实现 WordCount

SQL 模式的核心是将数据注册为临时视图,然后通过编写 SQL 语句来实现单词计数。

步骤如下:

  1. 将 DataFrame 注册为临时视图
df.createOrReplaceTempView("sentences")

  1. 编写 SQL 语句实现单词计数
# 使用 SQL 进行单词拆分、过滤和计数
word_count_sql = spark.sql("""SELECT word, COUNT(*) as countFROM (-- 拆分句子为单词SELECT explode(split(sentence, ' ')) as wordFROM sentences) tempWHERE word != ''  -- 过滤空字符串GROUP BY wordORDER BY count DESC
""")# 显示结果
word_count_sql.show()

  1. 输出结果
+--------+-----+
|    word|count|
+--------+-----+
|   Hello|    2|
|   Spark|    2|
|     SQL|    2|
|     DSL|    2|
|      is|    2|
|powerful|    1|
|flexible|    1|
+--------+-----+

方法二:DSL 模式实现 WordCount

DSL 模式(DataFrame API)通过调用 DataFrame 的方法链来实现功能,不需要编写 SQL 语句。

步骤如下:

# 使用 DataFrame API (DSL) 实现单词计数
word_count_dsl = df.select(# 拆分句子并展开为多行explode(split(col("sentence"), " ")).alias("word")
).filter(col("word") != ""  # 过滤空字符串
).groupBy(col("word")  # 按单词分组
).count(
).orderBy(col("count").desc()  # 按计数降序排列
)# 显示结果
word_count_dsl.show()

输出结果与 SQL 模式完全相同。

两种模式的对比分析

特点SQL 模式DSL 模式
语法风格使用标准 SQL 语句使用方法链调用(如 select、filter、groupBy)
适用人群熟悉 SQL 的数据分析师、数据工程师熟悉编程的开发者
灵活性适合复杂查询(如窗口函数、子查询)适合程序式数据处理流程
可读性对于复杂业务逻辑,SQL 结构更清晰对于数据处理流水线,方法链更直观
类型安全运行时检查部分支持编译时检查(Scala/Java)

完整代码示例

下面是两种模式的完整代码,可以直接运行:

from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, split, col# 初始化 SparkSession
spark = SparkSession.builder \.appName("WordCount with Spark SQL") \.master("local[*]") \.getOrCreate()# 准备示例数据
data = [("Hello Spark SQL",),("Hello DSL",),("Spark SQL is powerful",),("DSL is flexible",),("Spark and SQL and DSL",)
]
df = spark.createDataFrame(data, ["sentence"])
print("原始数据:")
df.show(truncate=False)# 方法1: SQL 模式实现 WordCount
print("\n=== SQL 模式结果 ===")
df.createOrReplaceTempView("sentences")
word_count_sql = spark.sql("""SELECT word, COUNT(*) as countFROM (SELECT explode(split(sentence, ' ')) as wordFROM sentences) tempWHERE word != ''GROUP BY wordORDER BY count DESC
""")
word_count_sql.show()# 方法2: DSL 模式实现 WordCount
print("\n=== DSL 模式结果 ===")
word_count_dsl = df.select(explode(split(col("sentence"), " ")).alias("word")
).filter(col("word") != ""
).groupBy("word"
).count(
).orderBy(col("count").desc()
)
word_count_dsl.show()# 停止 SparkSession
spark.stop()

关键函数解释

  1. split():将字符串按指定分隔符拆分,返回数组

    split(col("sentence"), " ")  # 按空格拆分句子
    
  2. explode():将数组中的每个元素转换为一行,实现 "行转列"

    explode(array_column)  # 将数组列展开为多行
    
  3. groupBy() + count():按指定列分组并计数

    groupBy("word").count()  # 按单词分组并计算出现次数
    

通过这两种方式,我们可以灵活地利用 Spark SQL 处理文本数据并实现单词计数,根据实际场景和个人习惯选择合适的方式即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91335.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91335.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91335.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

03 基于sklearn的机械学习-线性回归、损失函数及其推导

线性回归 分类的目标变量是标称型数据,回归是对连续型的数据做出预测。 一、标称型数据(Nominal Data) 标称型数据属于分类数据(Categorical Data) 的一种,用于描述事物的类别或属性,没有顺序或…

TTS语音合成|f5-tts语音合成服务器部署,实现http访问

p; 上篇文章分享了如何使用GPT-SoVITS实现一个HTTP服务器,并通过该服务器提供文本到语音(TTS)服务。今天,我们将进一步探讨如何部署另一个强大的TTS模型——f5-tts。这个模型在自然语音生成方面表现出色,具有高度的可…

【Golang】Go语言指针

Go语言指针 文章目录Go语言指针一、指针1.1、Go语言中的指针1.1.1、指针地址和指针类型1.1.2、指针取值1.1.3、空指针1.1.4、new和make1.1.5、new1.1.6、make1.1.7、new与make的区别一、指针 区别于C/C中的指针,Go语言中的指针不能进行偏移和运算,是安全…

EMC的一些简单常识

ESD测试比对 & 需要做到动作 试验: -780系统,板子直流地 和 PE连接(主板PE & DC-分开,但是前端板PE & DC-连接),只能承受1K接触放电。 -780系统,板子直流地 和 PE分开(主…

Day4||vue-计算属性

一.定义概念:基于现有的数据,计算出来的新属性。依赖的数据变化,自动重新计算。语法:声明需要放在computed的配置项中,一个计算属性对于一个函数。使用起来和普通属性一样使用{{计算属性名}}计算属性->可以将一段求…

编程算法在金融、医疗、教育、制造业等领域的落地案例

随着人工智能与大数据技术的迅猛发展,编程算法已从理论研究走向实际应用,在金融、医疗、教育、制造业等多个关键领域实现了深度落地。这些算法不仅提升了业务效率,还推动了行业智能化转型。本文将系统性地分析编程算法在四大核心领域的典型应…

vue npm install卡住没反应

install某个插件的时候,发现卡住不动,可以尝试以下解决方法 1.使用–verbose查看安装详情 npm install consola --verbose2.更换淘宝镜像(一般都是淘宝镜像正式过期问题) 查看当前镜像 npm config get registry更换淘宝镜像 第一种…

【Unity3D实例-功能-移动】角色移动-通过WSAD(CharacterController方式)

今天,我们就来聊聊如何在Unity中使用CharacterController组件,让角色能够灵活移动,在游戏世界里像风一样自由奔跑吧。废话不多说,走,让我们马上来一探究竟!目录:1.准备模型2.动画的处理3.为角色…

AI Agent开发学习系列 - langchain之LCEL(4):Memory

Memory的添加方式 from operator import itemgetterfrom langchain.memory import ConversationBufferMemory from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables import RunnableLambda, RunnablePassthrough from l…

向Coze学习,我们把这些工作流也开源了

要说现在最火的工作流是什么,那非视频工作流莫属了。我每天也都能接到不少咨询短视频工作流的需求。 这大半年来我们团队也制作和整理了超过 100 工作流,其中很大一部分都是现在最火的视频工作流。 为了向Coze开源致敬,这次我们斑码团队也决…

Git 从零开始:完整项目上传指南

一、准备工作 1. 安装 Git Windows:下载安装包macOS:在终端运行 brew install gitLinux: # Ubuntu/Debian sudo apt update && sudo apt install git# CentOS/Fedora sudo yum install git2. 配置用户信息(首次使用&am…

【AI】入门级提示词模板:适用于ChatGPT、文心一言等主流模型

入门级提示词模板:适用于 ChatGPT、文心一言等主流模型**在当下这个人工智能飞速发展的时代,ChatGPT、文心一言等主流大模型已经广泛地融入到我们的工作与生活当中。不管是创作文章、生成代码,还是进行数据分析、获取创意灵感,这些…

如何解决 undetected_chromedriver 启动慢问题

要解决 undetected_chromedriver 启动慢的问题,可以从以下几个方面优化配置和代码: 1. 指定本地 Chrome 二进制路径 避免自动搜索 Chrome 路径,直接指定位置: driver uc.Chrome(browser_executable_pathrC:\Program Files\Google…

Python 程序设计讲义(42):组合数据类型——元组类型:创建元组

Python 程序设计讲义(42):组合数据类型——元组类型:创建元组 目录Python 程序设计讲义(42):组合数据类型——元组类型:创建元组一、元组的特征二、创建元组1、使用圆括号&#xff0…

windows 设置 vscode 免密远程

我们可以使用 vscode ssh 进行远程编辑文件项目。也可以使用 ssh 密匙 来实现免密登录。 本人在本地windows系统有多个密匙,使用 D:\SPB_Data\.ssh\id_rsa_local 进行本地设备进行登录。 在 vscode ssh 配置文件中添加 IdentityFile 配置 Host 本地设备ipHostName …

ubuntu自动搭建Android平台NDK编译环境

sh setup_ndk_env.sh自动下载NDK并解压 提取Android平台工具链 验证Android工具链 设置工具链变量 export CROSS_TRIPLE=aarch64_linux_android export CROSS_ROOT=/home/ubuntu/${CROSS_TRIPLE} export ANDROID_NDK=${CROSS_ROOT} export AS=${CROSS_ROOT}/bin/llvm-as exp…

添加捕捉吸附标识(使用QT+OpenGL开发三维CAD)

捕捉吸附标识怎么画出来?在点吸附的时候能够展示吸附标识可以让用户更直观的看到当前捕捉点,从而更准确的进行设计和绘制。 效果视频见原文:添加捕捉吸附标识(使用QTOpenGL开发三维CAD) 16.Add snap label 鼠标捕捉吸…

元宇宙中的“虫洞“:技术实现、应用场景与未来挑战

一、技术定义与核心架构1.1 虫洞的元宇宙隐喻概念来源:虫洞在物理学中是连接不同时空的通道,而在元宇宙中,这一概念被引申为连接不同虚拟世界的跨平台协议。英伟达Omniverse平台通过USD(通用场景描述)实现了这一隐喻&a…

使用GIS中基于森林的分类与回归模型来估算房屋价值

“基于森林的分类与回归”,它可以帮助分析师有效地设计、测试和部署预测模型。 基于森林的分类与回归应用了 Leo Breiman 的随机森林算法,这是一种用于分类和预测的流行监督机器学习方法。该工具允许分析师轻松整合表格属性、基于距离的要素和解释栅格来…

《 java 随想录》| LeetCode链表高频考题

前言:这是专门针对java语言讲解的算法解析(题目顺序大致参考《代码随想录》)思维导图操作链表删除节点删除链表中 D 节点时,只需将其前驱节点 C 的 next 指针指向 D 的下一个节点 E。添加节点​先让 新节点 F 的 next 指针 指向 C…