← Back to list

SQL數據整理 by pySpark(1)

在大數據的學習裡,除了使用python的Pandas處理資料,Spark更是數據處理的好用工具,不但可以做到與Pandas相同的數據處理(包括data extraction及 data…

tshihyi · 2022-08-28 14:00 · 0 claps · 3.4 min read
#pyspark #hive-sql #spark-sql #data-analysis #data-engineering
Open on Medium ↗
Wiki topics: 🔧 · Data Engineering

SQL數據整理 by pySpark(1)

在大數據的學習裡,除了使用python的Pandas處理資料,Spark更是數據處理的好用工具,不但可以做到與Pandas相同的數據處理(包括data extraction及 data cleaning),還能直接使用SQL進行資料分析。再進階一點,自訂JSON格式進行資料交換也不是問題,相當便利好用。有別於Pandas的單機處理,還可以搭配RDD(Resilient Distributed DataSet)運算,加速資料處理及資料分析。

以下所使用的Spark SQL語法與Hive SQL均相通,記錄學習過程中幾種實務上好用的SQL數據使用技巧,供有需要的人參考。

前言

執行環境:Google Colab

執行前,記得先安裝pyspark package,語法如下,接下來就可以直接用下面的code進行實作。

!pip install pyspark

為閱讀上的便利,開頭的code參考如下,其餘的部分僅列出所需資料表以及主要處理的SQL語法。Pandas的呈現為有助於理解資料表(與一般所見的2維資料表相同),實際處理若無特別需求不必另外轉換成Pandas。

[embed]import pyspark library and create spark object

資料直轉橫

原始資料表

原始資料表

首先建立所需資料表,並將資料表轉成spark dataframe。利用createOrReplaceTempView直接轉view並執行SQL語法。

[embed]

SQL轉置後結果

SQL轉置後結果

直接使用pyspark,語法更加簡潔:

spark dataframe資料集.groupBy("想群組的欄位").pivot("想轉橫的欄位").sum("加總欄位").orderBy(asc("由小到大排序的欄位"))

[embed]data pivot by pyspark

pyspark data pivot result

pyspark data pivot result

雖然結果看起來一樣,但SQL的資料型態是pandas的dataframe,與pysaprk轉出的Spark dataframe是不一樣的類型,使用上差異也很大,千萬不要搞混囉~

資料橫轉直

年度季銷售表

年度季銷售表

[embed]

SQL資料橫轉直結果

SQL資料橫轉直結果

使用pyspark的stack及expr處理:

stack(要向下展開的數量, 'key1名稱',value1,’key2名稱’,value2,....) as(key欄位名稱,value欄位名稱)

[embed]unpivot by pySpark

unpivot by pySpark result

unpivot by pySpark result

小結:pySpark只要短短的幾句或一行,就可以折抵好幾行的SQL語法,雖然一開始使用還不太習慣,但是久了以後就會發現它的簡單強大。

參考資料:

  1. SQL商業資料分析術/旗標出版社/朱浚賢 譯
  2. https://sparkbyexamples.com/pyspark/pyspark-pivot-and-unpivot-dataframe/

메타데이터
post_id
5e2f132a65e
slug
sql數據整理-by-pyspark-1-5e2f132a65e
url
https://medium.com/@tshihyi/sql%E6%95%B8%E6%93%9A%E6%95%B4%E7%90%86-by-pyspark-1-5e2f132a65e
canonical_url
https://medium.com/@tshihyi/sql%E6%95%B8%E6%93%9A%E6%95%B4%E7%90%86-by-pyspark-1-5e2f132a65e
author_url
https://medium.com/@tshihyi
status
ok
fetched_at
2026-07-26 17:39:23