Spark-SQL 項目

一、項目概述

(一)實驗目標

  1. 統計有效數據條數:篩選出uid、phone、addr三個字段均無空值的記錄并計數。
  2. 提取用戶數量最多的前 20 個地址:按地址分組統計用戶數,按降序排序后取前 20 名。

(二)數據說明

  1. 數據格式
    • 輸入數據為 JSON 格式,字段包括uid(用戶 ID)、phone(電話號碼)、addr(地址)。
    • 數據特點:部分記錄存在格式不規范問題(如單引號混用、字段值缺失、地址格式不統一,例如 “江蘇省 蘇州”“廣東省 中山” 等),需先清洗轉換。
    • 示例數據

json

{"uid":"1000166111","phone":"17703771999","addr":"河南省 南陽"}

{"uid":"1000432103","phone":"15388889881","addr":"云南省 昆明"}

  1. 有效數據定義
    同時滿足以下條件的記錄:
    • uid不為空(非null且非空字符串);
    • phone不為空(非null且非空字符串);
    • addr不為空(非null且非空字符串)。

二、實驗準備

(一)環境配置

  1. 軟件依賴
    • Spark 3.x+(需啟用 Hive 支持以使用get_json_object函數);
    • 編程語言:Scala/Python(本文以 Scala 為例,Python 代碼可通過 PySpark 實現);
    • 配置文件:確保spark.sql.warehouse.dir指向 HDFS 或本地路徑(如hdfs://node01:9000/user/hive/warehouse)。
  2. 數據準備
    • 將 JSON 數據保存為文件(如user_data.json),確保每行一個 JSON 對象;
    • 若存在格式錯誤(如單引號),先用文本處理工具(如sed 's/\'/"/g')統一為雙引號。

三、數據處理流程

(一)數據讀取與格式轉換

1. 讀取原始數據

使用 Spark 的 JSON 數據源直接加載數據,自動推斷 Schema:

scala

val rawDF = spark.read.json("path/to/user_data.json")

rawDF.printSchema() // 檢查字段是否正確解析(可能因格式問題導致字段類型為String)

2. 字段提取與清洗

通過get_json_object函數(Spark SQL 內置函數)解析 JSON 字段,處理不規范格式:

scala

// 方法1:Spark SQL語句(推薦,清晰易讀)

rawDF.createOrReplaceTempView("raw_data")

val parsedDF = spark.sql("""

SELECT

get_json_object(raw_data.data, '$.uid') AS uid, -- 提取uid

get_json_object(raw_data.data, '$.phone') AS phone, -- 提取phone

trim(get_json_object(raw_data.data, '$.addr')) AS addr -- 提取addr并去除前后空格

FROM raw_data

""")

// 方法2:DataFrame API(適合編程式處理)

import org.apache.spark.sql.functions.expr

val parsedDF = rawDF.select(

expr("get_json_object(data, '$.uid')").as("uid"),

expr("get_json_object(data, '$.phone')").as("phone"),

expr("trim(get_json_object(data, '$.addr'))").as("addr")

)

(二)統計有效數據條數

1. 篩選有效數據

過濾掉任一字段為空的記錄:

scala

val validDF = parsedDF.filter(

col("uid").isNotNull &&

col("phone").isNotNull &&

col("addr").isNotNull

)

或通過SQL語句:

spark.sql("SELECT * FROM parsed_data WHERE uid IS NOT NULL AND phone IS NOT NULL AND addr IS NOT NULL")

2. 計數

scala

val validCount = validDF.count()

println(s"有效數據條數:$validCount")

或通過SQL返回結果:

spark.sql("SELECT COUNT(*) AS valid_data_count FROM valid_data").show()

(三)統計用戶數量最多的前 20 個地址

1. 分組聚合

按addr分組,統計每個地址的用戶數(直接使用count(*),因uid唯一,也可count(DISTINCT uid),需根據業務需求選擇):

scala

val addrGroupDF = validDF.groupBy("addr").count().withColumnRenamed("count", "user_count")

2. 排序與篩選

按用戶數降序排序,取前 20 條:

scala

val top20Addresses = addrGroupDF.orderBy(desc("user_count")).limit(20)

top20Addresses.show(false) // 展示結果,地址不換行

3. SQL 完整實現

spark.sql("""

SELECT

addr,

COUNT(*) AS user_count-- 或COUNT(DISTINCT uid)去重統計

FROM valid_data

GROUP BY addr

ORDER BY user_count DESC

LIMIT 20

""").show()

五、擴展與優化建議

(一)數據清洗增強

  1. 地址標準化:使用正則表達式或自定義函數清洗地址(如 “江蘇省蘇州” 統一為 “江蘇省蘇州市”);
  2. 手機號格式校驗:添加正則表達式過濾無效手機號(如^1[3-9]\d{9}$)。

(二)性能優化

  1. 分區與緩存:對大數據集使用repartition分區,對高頻訪問的中間表(如validDF)調用cache();
  2. 列式存儲:將結果數據保存為 Parquet 格式(validDF.write.parquet("output/valid_data")),提升后續查詢效率。

(三)結果輸出

將最終結果導出到 HDFS、本地文件或數據庫:

scala

top20Addresses.write

.mode("overwrite")

.csv("output/top20_addresses") // 保存為CSV文件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78373.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78373.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78373.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis的ZSet對象底層原理——跳表

我們來聊聊「跳表(Skip List)」,這是一個既經典又優雅的數據結構,尤其在 Redis 中非常重要,比如 ZSet(有序集合)底層就用到了跳表。 🌟 跳表(Skip List)簡介 …

2025深圳中興通訊安卓開發社招面經

2月27號 中興通訊一面 30多分鐘 自我介紹 聊項目 我的優缺點,跟同事相比,有什么突出的地方 Handler機制,如何判斷是哪個消息比較耗時 設計模式:模板模式 線程的狀態 線程的開啟方式 線程池原理 活動的啟動模式 Service和Activity…

【Castle-X機器人】二、智能導覽模塊安裝與調試

持續更新。。。。。。。。。。。。。。。 【Castle-X機器人】智能導覽模塊安裝與調試 二、智能導覽模塊安裝與調試2.1 智能導覽模塊安裝2.2 智能導覽模塊調試2.2.1 紅外測溫傳感器測試2.2.2 2D攝像頭測試 二、智能導覽模塊安裝與調試 2.1 智能導覽模塊安裝 使用相應工具將智能…

深入理解二叉樹遍歷:遞歸與棧的雙重視角

二叉樹的遍歷前序遍歷中序遍歷后續遍歷總結 二叉樹的遍歷 雖然用遞歸的方法遍歷二叉樹實現起來更簡單,但是要想深入理解二叉樹的遍歷,我們還必須要掌握用棧遍歷二叉樹,遞歸其實就是利用了系統棧去遍歷。特此記錄一下如何用雙重視角去看待二叉…

Qt Creator中自定義應用程序的可執行文件圖標

要在Qt Creator中為你的應用程序設置自定義可執行文件圖標,你需要按照以下步驟操作: Windows平臺設置方法 準備圖標文件: 創建一個.ico格式的圖標文件(推薦使用256x256像素,包含多種尺寸) 可以使用在線工…

Windows11系統中GIT下載

Windows11系統中GIT下載 0、GIT背景介紹0.0 GIT概述0.1 GIT誕生背景0.2 Linus Torvalds 的設計目標0.3 Git 的誕生(2005 年)0.4 Git 的后續發展0.5 為什么 Git 能成功? 1、資源下載地址1.1 官網資源1.2 站內資源 2、安裝指導3、驗證是否下載完…

react的fiber 用法

在 React 里,Fiber 是 React 16.x 及后續版本采用的協調算法,它把渲染工作分割成多個小任務,讓 React 可以在渲染過程中暫停、恢復和復用任務,以此提升渲染性能與響應能力。在實際開發中,你無需直接操作 Fiber 節點&am…

FPGA前瞻篇-數字電路基礎-邏輯門電路設計

模擬信號: 一條隨時間連續變化、平滑波動的曲線,比如正弦波。 數字信號: 一條只有高低兩個狀態(0和1),跳變清晰的方波曲線。 在 IC 或 FPGA 的邏輯設計中,我們通常只能處理數字信號&#xff0…

RabbitMQ 基礎概念(隊列、交換機、路由鍵、綁定鍵、信道、連接、虛擬主機、多租戶)介紹

本文是博主在梳理 RabbitMQ 知識的過程中,將所遇到和可能會遇到的基礎知識記錄下來,用作梳理 RabbitMQ 的整體架構和功能的線索文章,通過查找對應的知識能夠快速的了解對應的知識而解決相應的問題。 文章目錄 一、RabbitMQ 是什么&#xff1f…

機器學習第一篇 線性回歸

數據集:公開的World Happiness Report | Kaggle中的happiness dataset2017. 目標:基于GDP值預測幸福指數。(單特征預測) 代碼: 文件一:prepare_for_traning.py """用于科學計算的一個庫…

Java面試高頻問題(29-30)

二十九、全鏈路壓測:數據隔離與流量 關鍵技術點 1. 流量染色:通過Header注入X-Test-TraceId標識壓測流量 2. 影子庫表:通過ShardingSphere實現數據隔離 3. 熔斷降級:壓測流量觸發異常時自動切換回生產數據源 數據隔離方案對比 …

Python常用的第三方模塊之數據分析【pdfplumber庫、Numpy庫、Pandas庫、Matplotlib庫】

【pdfplumber庫】從PDF文件中讀取內容 import pdfplumber #打開PDF文件 with pdfplumber.open(DeepSeek從入門到精通(20250204).pdf) as pdf:for i in pdf.pages: #遍歷頁print(i.extract_text()) #extract_text()方法提取內容print(f----------------第{i.page_number}頁結束…

長短板理論——AI與思維模型【83】

一、定義 長短板理論思維模型,也被稱為木桶原理,是指一只木桶能盛多少水,并不取決于最長的那塊木板,而是取決于最短的那塊木板。該理論將木桶視為一個整體系統,各個木板代表著系統的不同組成部分或要素,強…

2025藍橋省賽c++B組第二場題解

前言 這場的題目非常的簡單啊,至于為什么有第二場,因為當時河北正在刮大風被迫停止了QwQ,個人感覺是歷年來最簡單的一場,如果有什么不足之處,還望補充。 試題 A: 密密擺放 【問題描述】 小藍有一個大箱子&#xff0…

【數據結構與算法】從完全二叉樹到堆再到優先隊列

完全二叉樹 CBT 設二叉樹的深度為 h , 若非最底層的其他各層的節點數都達到最大個數 , 最底層 h 的所有節點都連續集中在左側的二叉樹叫做 完全二叉樹 . 特點 對任意節點 , 其右分支下的葉子節點的最底層為 L , 則其左分支下的葉子節點的最低層一定是 L 或 L 1 .完全二叉樹…

Leetcode:1. 兩數之和

題目 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target 的那 兩個 整數,并返回它們的數組下標。 你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。 你可以按任意順序返回答案。 示…

flume整合kafka

需求一: 啟動flume 啟動kafka消費者,驗證數據寫入成功 新增測試數據 需求二: 啟動Kafka生產者 啟動Flume 在生產者中寫入數據

Hbase集群管理與實踐

一、HBase集群搭建實戰 1.1 環境規劃建議 硬件配置基準(以10節點集群為例): 角色CPU內存磁盤網絡HMaster4核16GBSSD 200GB(系統盤)10GbpsRegionServer16核64GB124TB HDD(JBOD)25GbpsZooKeeper4核8GBSSD 500GB10Gbps1.2 關鍵配置項示例(hbase-site.xml) <configu…

STM32 開發 - stm32f10x.h 頭文件(內存映射、寄存器結構體與宏、寄存器位定義、實現點燈案例)

概述 STM32F10x.h 是 STM32F1 系列微控制器的核心頭文件&#xff0c;提供了所有外設寄存器的定義和內存映射 一、內存映射 #define PERIPH_BASE ((uint32_t)0x40000000)#define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE 0x…

QEMU源碼全解析 —— 塊設備虛擬化(23)

接前一篇文章:QEMU源碼全解析 —— 塊設備虛擬化(22) 本文內容參考: 《趣談Linux操作系統》 —— 劉超,極客時間 《QEMU/KVM源碼解析與應用》 —— 李強,機械工業出版社 特此致謝! QEMU啟動過程中的塊設備虛擬化 上一回解析了qcow2格式對應的qcow2_open函數,本回解…