Spark SQL 的 SQL 模式和 DSL模式

下面我將詳細講解如何使用 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…