圖解大資料 | 綜合案例-使用Spark分析挖掘零售交易資料
作者:韓信子@ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/84
本文地址:http://www.showmeai.tech/article-detail/177
宣告:版權所有,轉載請聯絡平臺與作者並註明出處
引言
電商與新零售是目前大資料與AI應用最廣泛的場景之一,本案例以跨國線上零售業務為背景,講解使用pyspark對HDFS儲存的資料進行交易資料分析的過程,並且對分析結果使用echarts做了視覺化呈現。
1.環境搭建
本次作業使用的環境和軟體如下:
- (1)Linux作業系統:Ubuntu 16.04
- (2)Python:3.8
- (3)Hadoop:3.1.3
- (4)Spark:2.4.0
- (5)Bottle:v0.13
Bottle是一個快速、簡潔、輕量級的基於WSIG的微型Web框架,此框架除了Python的標準庫外,不依賴任何其他模組。安裝方法是,開啟Linux終端,執行如下命令:
sudo apt-get install python3-pip
pip3 install bottle
2.資料預處理
本案例的資料集來自Kaggle平臺,是跨國線上零售業務交易資料,大家可以通過如下的百度網盤地址下載。
資料集和原始碼下載(百度網盤)
連結:https://pan.baidu.com/s/1zg2MoNNZrjGTQC5ohwQkJA
提取碼:show
這是一家在英國註冊的公司,主要銷售禮品。資料集 E_Commerce_Data.csv
包含541909條記錄,時間跨度為2010-12-01到2011-12-09,每個記錄由8個屬性組成,具體的含義如下表所示:
欄位名稱 | 型別 | 含義 | 舉例 |
---|---|---|---|
InvoiceNo | string | 訂單編號(退貨訂單以C開頭) | 536365 |
StockCode | string | 產品程式碼 | 85123A |
Description | string | 產品描述 | WHITE METAL LANTERN |
Quantity | integer | 購買數量(負數表示退貨) | 6 |
InvoiceDate | string | 訂單日期和時間 | 12/1/2010 8:26 |
UnitPrice | double | 單價(英鎊) | 3.39 |
CustomerID | integer | 客戶編號 | 17850 |
Country | string | 國家名稱 | United Kingdom |
我們先將資料集E_Commerce_Data.csv
上傳至hdfs上,命令如下:
hdfs dfs -put E_Commerce_Data.csv
大家可以通過如下命令進入pyspark的互動式程式設計環境,或者在配置好pyspark的jupyter Notebook中,對資料進行初步探索和清洗:
cd /usr/local/spark #進入Spark安裝目錄
./bin/pyspark
(1)讀取在HDFS上的檔案,以csv的格式讀取,得到DataFrame物件
df=spark.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('E_Commerce_Data.csv')
(2)檢視資料集的大小,輸出541909,不包含標題行
df.count()
(3)列印資料集的schema,檢視欄位及其型別資訊。輸出內容就是上文中的屬性表
df.printSchema()
(4)建立臨時檢視data
df.createOrReplaceTempView("data")
(5)由於顧客編號CustomID
和商品描述 Description
均存在部分缺失,所以進行資料清洗,過濾掉有缺失值的記錄。特別地,由於 CustomID為integer
型別,所以該欄位若為空,則在讀取時被解析為0,故用 df[“CustomerID”]!=0
條件過濾。
clean=df.filter(df["CustomerID"]!=0).filter(df["Description"]!="")
(6)檢視清洗後的資料集的大小,輸出406829。
clean.count()
(7)將清洗後的檔案以csv的格式,寫入 E_Commerce_Data_Clean.csv
中(實際上這是目錄名,真正的檔案在該目錄下,檔名類似於 part-00000
,需要確保HDFS中不存在這個目錄,否則寫入時會報“already exists”錯誤)
clean.write.format("com.databricks.spark.csv").options(header='true',inferschema='true').save('E_Commerce_Data_Clean.csv')
3.資料分析
資料集和原始碼下載(百度網盤)
連結:https://pan.baidu.com/s/1zg2MoNNZrjGTQC5ohwQkJA
提取碼:show
我們構建一個總體的分析指令碼 sales_data_analysis.py
,先匯入需要用到的python模組。
- 獲取資料集與程式碼 → ShowMeAI的官方GitHub https://github.com/ShowMeAI-Hub/awesome-AI-cheatsheets
- 執行程式碼段與學習 → 線上程式設計環境 http://blog.showmeai.tech/python3-compiler
# -*- coding: utf-8 -*-
from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.types import StringType, DoubleType, IntegerType, StructField, StructType
import json
import os
接著初始化SparkSession物件。
sc = SparkContext('local', 'spark_project')
sc.setLogLevel('WARN')
spark = SparkSession.builder.getOrCreate()
之後從HDFS中以csv的格式讀取清洗後的資料目錄 E_Commerce_Data_Clean.csv
,spark得到DataFrame物件,並建立臨時檢視data用於後續分析。
df = spark.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('E_Commerce_Data_Clean.csv')
df.createOrReplaceTempView("data")
為方便統計結果的視覺化,將結果匯出為json檔案供web頁面渲染。使用save方法匯出資料:
def save(path, data):
with open(path, 'w') as f:
f.write(data)
1)資料概覽
(1)客戶數最多的10個國家
每個客戶由編號 CustomerID
唯一標識,所以客戶的數量為 COUNT(DISTINCT CustomerID)
,再按照國家 Country 分組統計,根據客戶數降序排序,篩選出10個客戶數最多的國家。得到的countryCustomerDF為DataFrame
型別,執行 collect()
方法即可將結果以陣列的格式返回。
def countryCustomer():
countryCustomerDF = spark.sql("SELECT Country,COUNT(DISTINCT CustomerID) AS countOfCustomer FROM data GROUP BY Country ORDER BY countOfCustomer DESC LIMIT 10")
return countryCustomerDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[國家名稱,客戶數]
(2)銷量最高的10個國家
Quantity
欄位表示銷量,因為退貨的記錄中此欄位為負數,所以使用 SUM(Quantity)
即可統計出總銷量,即使有退貨的情況。再按照國家 Country 分組統計,根據銷量降序排序,篩選出10個銷量最高的國家。得到的 countryQuantityDF
為DataFrame型別,執行 collect()
方法即可將結果以陣列的格式返回。
def countryQuantity():
countryQuantityDF = spark.sql("SELECT Country,SUM(Quantity) AS sumOfQuantity FROM data GROUP BY Country ORDER BY sumOfQuantity DESC LIMIT 10")
return countryQuantityDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[國家名稱,銷量]
(3)各個國家的總銷售額分佈情況
UnitPrice
欄位表示單價,Quantity
欄位表示銷量,退貨的記錄中 Quantity
欄位為負數,所以使用 SUM(UnitPrice*Quantity)
即可統計出總銷售額,即使有退貨的情況。再按照國家 Country
分組統計,計算出各個國家的總銷售額。得到的 countrySumOfPriceDF
為 DataFrame
型別,執行 collect()
方法即可將結果以陣列的格式返回。
def countrySumOfPrice():
countrySumOfPriceDF = spark.sql("SELECT Country,SUM(UnitPrice*Quantity) AS sumOfPrice FROM data GROUP BY Country")
return countrySumOfPriceDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[國家名稱,總銷售額]
(4)銷量最高的10個商品
Quantity
欄位表示銷量,退貨的記錄中 Quantity
欄位為負數,所以使用 SUM(Quantity)
即可統計出總銷量,即使有退貨的情況。再按照商品編碼 StockCode
分組統計,計算出各個商品的銷量。得到的 stockQuantityDF
為 DataFrame
型別,執行 collect()
方法即可將結果以陣列的格式返回。
def stockQuantity():
stockQuantityDF = spark.sql("SELECT StockCode,SUM(Quantity) AS sumOfQuantity FROM data GROUP BY StockCode ORDER BY sumOfQuantity DESC LIMIT 10")
return stockQuantityDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[商品編號,銷量]
(5)商品描述的熱門關鍵詞Top300
Description
欄位表示商品描述,由若干個單片語成,使用 LOWER(Description)
將單詞統一轉換為小寫。此時的結果為 DataFrame
型別,轉化為 rdd
後進行詞頻統計,再根據單詞出現的次數進行降序排序,流程圖如下:
得到的結果為RDD型別,為其製作表頭 wordCountSchema
,包含 word
和 count
屬性,分別為 string
型別和 integer
型別。呼叫 createDataFrame()
方法將其轉換為 DataFrame
型別的 wordCountDF
,將word為空字串的記錄剔除掉,呼叫 take()
方法得到出現次數最多的300個關鍵 詞,以陣列的格式返回。
def wordCount():
wordCount = spark.sql("SELECT LOWER(Description) as description from data").rdd.flatMap(lambda line:line['description'].split(" ")).map(lambda word:(word,1)).reduceByKey(lambda a,b:a+b).repartition(1).sortBy(lambda x:x[1],False)
wordCountSchema = StructType([StructField("word", StringType(), True),StructField("count", IntegerType(), True)])
wordCountDF = spark.createDataFrame(wordCount, wordCountSchema)
wordCountDF = wordCountDF.filter(wordCountDF["word"]!='')
return wordCountDF.take(300)
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[關鍵詞,次數]
(6)退貨訂單數最多的10個國家
InvoiceNo
欄位表示訂單編號,所以訂單總數為 COUNT(DISTINCT InvoiceNo)
,由於退貨訂單的編號的首個字母為C,例如C540250,所以利用 WHERE InvoiceNo LIKE ‘C%’
子句即可篩選出退貨的訂單,再按照國家Country分組統計,根據退貨訂單數降序排序,篩選出10個退貨訂單數最多的國家。得到的 countryReturnInvoiceDF
為 DataFrame
型別,執行 collect()
方法即可將結果以陣列的格式返回。
def countryReturnInvoice():
countryReturnInvoiceDF = spark.sql("SELECT Country,COUNT(DISTINCT InvoiceNo) AS countOfReturnInvoice FROM data WHERE InvoiceNo LIKE 'C%' GROUP BY Country ORDER BY countOfReturnInvoice DESC LIMIT 10")
return countryReturnInvoiceDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[國家名稱,退貨訂單數]
2)關聯分析
(7)月銷售額隨時間的變化趨勢
統計月銷售額需要3個欄位的資訊,分別為訂單日期 InvoiceDate
,銷量Quantity
和單價UnitPrice
。由於InvoiceDate
欄位格式不容易處理,例如“8/5/2011 16:19”,所以需要對這個欄位進行格式化操作。由於統計不涉及小時和分鐘數,所以只擷取年月日部分,並且當數值小於10時補前置0來統一格式,期望得到年、月、日3個獨立欄位。先實現 formatData()
方法,利用 rdd
對日期、銷量和單價欄位進行處理。
def formatData():
tradeRDD = df.select("InvoiceDate","Quantity","UnitPrice",).rdd
result1 = tradeRDD.map(lambda line: (line['InvoiceDate'].split(" ")[0], line['Quantity'] , line['UnitPrice']))
result2 = result1.map(lambda line: (line[0].split("/"), line[1], line[2]))
result3 = result2.map(lambda line: (line[0][2], line[0][0] if len(line[0][0])==2 else "0"+line[0][0], line[0][1] if len(line[0][1])==2 else "0"+line[0][1], line[1], line[2]))
return result3
流程圖如下:
由於要統計的是月銷售額的變化趨勢,所以只需將日期轉換為“2011-08”這樣的格式即可。而銷售額表示為單價乘以銷量,需要注意的是,退貨時的銷量為負數,所以對結果求和可以表示銷售額。RDD的轉換流程如下:
得到的結果為RDD型別,為其製作表頭 schema
,包含 date
和 tradePrice
屬性,分別為string
型別和double
型別。呼叫 createDataFrame()
方法將其轉換為DataFrame
型別的 tradePriceDF
,呼叫 collect()
方法將結果以陣列的格式返回。
def tradePrice():
result3 = formatData()
result4 = result3.map(lambda line:(line[0]+"-"+line[1],line[3]*line[4]))
result5 = result4.reduceByKey(lambda a,b:a+b).sortByKey()
schema = StructType([StructField("date", StringType(), True),StructField("tradePrice", DoubleType(), True)])
tradePriceDF = spark.createDataFrame(result5, schema)
return tradePriceDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[日期,銷售額]
(8)日銷量隨時間的變化趨勢
由於要統計的是日銷量的變化趨勢,所以只需將日期轉換為“2011-08-05”這樣的格式即可。先呼叫上例的 formatData()
方法對日期格式進行格式化。RDD的轉換流程如下:
得到的結果為RDD型別,為其製作表頭schema,包含date和saleQuantity屬性,分別為string型別和integer型別。呼叫createDataFrame()
方法將其轉換為DataFrame型別的saleQuantityDF,呼叫collect()
方法將結果以陣列的格式返回。
def saleQuantity():
result3 = formatData()
result4 = result3.map(lambda line:(line[0]+"-"+line[1]+"-"+line[2],line[3]))
result5 = result4.reduceByKey(lambda a,b:a+b).sortByKey()
schema = StructType([StructField("date", StringType(), True),StructField("saleQuantity", IntegerType(), True)])
saleQuantityDF = spark.createDataFrame(result5, schema)
return saleQuantityDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[日期,銷量]
(9)各國的購買訂單量和退貨訂單量的關係
InvoiceNo
欄位表示訂單編號,退貨訂單的編號的首個字母為C,例如C540250。利用 COUNT(DISTINCT InvoiceNo)
子句統計訂單總量,再分別用 WHERE InvoiceNo LIKE ‘C%’
和 WHERE InvoiceNo NOT LIKE ‘C%’
統計出退貨訂單量和購買訂單量。接著按照國家 Country
分組統計,得到的returnDF
和buyDF
均為DataFrame
型別,分別表示退貨訂單和購買訂單,如下所示:
再對這兩個DataFrame
執行join操作,連線條件為國家Country相同,得到一個DataFrame。但是這個DataFrame中有4個屬性,包含2個重複的國家Country屬性和1個退貨訂單量和1個購買訂單量,為減少冗餘,對結果篩選3個欄位形成buyReturnDF。如下所示:
最後執行collect()
方法即可將結果以陣列的格式返回。
def buyReturn():
returnDF = spark.sql("SELECT Country AS Country,COUNT(DISTINCT InvoiceNo) AS countOfReturn FROM data WHERE InvoiceNo LIKE 'C%' GROUP BY Country")
buyDF = spark.sql("SELECT Country AS Country2,COUNT(DISTINCT InvoiceNo) AS countOfBuy FROM data WHERE InvoiceNo NOT LIKE 'C%' GROUP BY Country2")
buyReturnDF = returnDF.join(buyDF, returnDF["Country"] == buyDF["Country2"], "left_outer")
buyReturnDF = buyReturnDF.select(buyReturnDF["Country"],buyReturnDF["countOfBuy"],buyReturnDF["countOfReturn"])
return buyReturnDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[國家名稱,購買訂單數,退貨訂單數]
(10)商品的平均單價與銷量的關係
由於商品的單價UnitPrice
是不斷變化的,所以使用平均單價AVG(DISTINCT UnitPrice)
來衡量一個商品。再利用SUM(Quantity)
計算出銷量,將結果按照商品的編號進行分組統計,執行collect()
方法即可將結果以陣列的格式返回。
def unitPriceSales():
unitPriceSalesDF = spark.sql("SELECT StockCode,AVG(DISTINCT UnitPrice) AS avgUnitPrice,SUM(Quantity) AS sumOfQuantity FROM data GROUP BY StockCode")
return unitPriceSalesDF.collect()
最後呼叫save方法就可以將結果匯出至檔案了,格式如下:
[商品編號,平均單價,銷量]
3)小結
在sales_data_analysis.py
中新增main
函式,將上面的分析過程整合起來方便進行呼叫,程式碼如下:
- 獲取資料集與程式碼 → ShowMeAI的官方GitHub https://github.com/ShowMeAI-Hub/awesome-AI-cheatsheets
- 執行程式碼段與學習 → 線上程式設計環境 http://blog.showmeai.tech/python3-compiler
if __name__ == "__main__":
base = "static/"
if not os.path.exists(base):
os.mkdir(base)
m = {
"countryCustomer": {
"method": countryCustomer,
"path": "countryCustomer.json"
},
"countryQuantity": {
"method": countryQuantity,
"path": "countryQuantity.json"
},
"countrySumOfPrice": {
"method": countrySumOfPrice,
"path": "countrySumOfPrice.json"
},
"stockQuantity": {
"method": stockQuantity,
"path": "stockQuantity.json"
},
"wordCount": {
"method": wordCount,
"path": "wordCount.json"
},
"countryReturnInvoice": {
"method": countryReturnInvoice,
"path": "countryReturnInvoice.json"
},
"tradePrice": {
"method": tradePrice,
"path": "tradePrice.json"
},
"saleQuantity": {
"method": saleQuantity,
"path": "saleQuantity.json"
},
"buyReturn": {
"method": buyReturn,
"path": "buyReturn.json"
},
"unitPriceSales": {
"method": unitPriceSales,
"path": "unitPriceSales.json"
}
}
for k in m:
p = m[k]
f = p["method"]
save(base + m[k]["path"], json.dumps(f()))
print ("done -> " + k + " , save to -> " + base + m[k]["path"])
上面的程式碼將所有的函式整合在變數 m中,通過迴圈呼叫上述所有方法並匯出json檔案到當前路徑的static目錄下。
最後利用如下指令執行分析程式:
cd /usr/local/spark
./bin/spark-submit sales_data_analysis.py
4.資料視覺化
本專案視覺化使用百度開源的免費資料展示框架Echarts。Echarts是一個純Javascript的圖表庫,可以流暢地執行在PC和移動裝置上,相容當前絕大部分瀏覽器,底層依賴輕量級的Canvas類庫ZRender,提供直觀,生動,可互動,可高度個性化定製的資料視覺化圖表。
- 獲取資料集與程式碼 → ShowMeAI的官方GitHub https://github.com/ShowMeAI-Hub/awesome-AI-cheatsheets
- 執行程式碼段與學習 → 線上程式設計環境 http://blog.showmeai.tech/python3-compiler
編寫web.py程式,實現一個簡單的web伺服器,程式碼如下:
from bottle import route, run, static_file
import json
@route('/static/<filename>')
def server_static(filename):
return static_file(filename, root="./static")
@route("/<name:re:.*\.html>")
def server_page(name):
return static_file(name, root=".")
@route("/")
def index():
return static_file("index.html", root=".")
run(host="0.0.0.0", port=8888)
bottle伺服器對接收到的請求進行路由,規則如下:
(1)訪問/static/
時,返回靜態檔案
(2)訪問/.html
時,返回網頁檔案
(3)訪問/時,返回首頁index.html
伺服器的8888埠監聽來自任意ip的請求(前提是請求方能訪問到這臺伺服器)。
首頁index.html
的主要程式碼如下(由於篇幅較大,只擷取主要的部分)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,height=device-height">
<title>E-Commerce-Data 線上零售業務資料分析</title>
<style>
/* 省略 */
</style>
</head>
<body>
<div class="container">
/* 只展示第一個統計結果的程式碼,其餘省略 */
<div class="chart-group">
<h3>(1) 客戶數最多的10個國家
<br>
<small style="font-size: 72%;">
——英國的客戶最多,達到3950個,數量遠大於其他國家;其次是德國、法國、西班牙等
</small>
</h3>
<iframe src="countryCustomer.html" class="frame" frameborder="0"></iframe>
</div>
</div>
<script>document.body.clientHeight;</script>
</body>
</html>
圖表頁通過一個iframe嵌入到首頁中。以第一個統計結果的網頁countryCustomer.html
為例,展示主要程式碼:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
/* 省略 */
</style>
</head>
<body>
<div id="chart" style="width:95%;height:95%;"></div>
<script src="static/jquery-3.2.1.min.js"></script>
<script src="static/echarts-4.7.0.min.js"></script>
<script>
var myChart = echarts.init(document.getElementById('chart'));
myChart.setOption(
{
color: ['#3398DB'],
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: [
{
name: '國家',
data: [],
axisTick: {
alignWithLabel: true
},
axisLabel: {
interval:0,
rotate:40
}
}
],
yAxis: [
{
name: '客戶數',
}
],
series: [
{
name: '客戶數',
type: 'bar',
barWidth: '60%',
data: []
}
]
});
myChart.showLoading();
$.getJSON("/static/countryCustomer.json", data => {
var names=[];
var nums=[];
data = data.map(v => ({
country: v[0],
customer: parseInt(v[1]),
}))
for(var i=0;i<data.length;i++){
names.push(data[i].country);
nums.push(data[i].customer);
}
myChart.setOption({
xAxis: {
data: names
},
series: [{
data: nums
}]
});
myChart.hideLoading();
})
</script>
</body>
</html>
程式碼完成後,在程式碼所在的根目錄下執行以下指令啟動web伺服器:
python3 web.py
若打印出以下資訊則表示web服務啟動成功。接著,可以通過使用瀏覽器訪問網頁的方式檢視統計結果。
Bottle v0.12.18 server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:9999/
Hit Ctrl-C to quit.
我們可以把整個資料分析和視覺化的過程整理成一個處理流水線,編寫run.sh指令碼:
- 首先向spark提交sales_data_analysis.py程式對資料進行統計分析,生成的json檔案會存入當前路徑的static目錄下;
- 接著執行web.py程式,即啟動web伺服器對分析程式生成的json檔案進行解析渲染,方便使用者通過瀏覽器檢視統計結果的視覺化介面。
#!/bin/bash
cd /usr/local/spark
./bin/spark-submit sales_data_analysis.py
python3 web.py
注意:該指令碼的流程要能正常執行,需要保證HDFS中有 E_Commerce_Data_Clean.csv
,大家要注意提前把清洗過後的資料存放至HDFS。
5.視覺化圖示
(1)客戶數最多的10個國家
英國的客戶最多,達到3950個,數量遠大於其他國家;其次是德國、法國、西班牙等。
(2)銷量最高的10個國家
英國的銷量最高,達到4008533件,遠大於其他國家;其次是紐西蘭、愛爾蘭、德國等。
(3)各個國家的總銷售額分佈情況
英國的總銷售額最高,達到6767873.394英鎊,佔比81.54%
(4)銷量最高的10個商品
編號為84077的商品銷量最高,達到53215件;銷量Top3的商品在數量上差距並不大。
(5)商品描述的熱門關鍵詞Top300
熱門關鍵詞包括bag、red、heart、pink、christmas、cake等。
(6)退貨訂單數最多的10個國家
英國的退貨訂單最多,達到3208個,遠大於其他國家;其次是德國、法國、愛爾蘭等。
(7)月銷售額隨時間的變化趨勢
銷售額較高的月份主要集中在下半年;由於該公司主要售賣禮品,並且下半年的節日較多,所以銷售額比上半年高;2011年12月的銷售額較低是因為資料只統計到2011/12/9 。
(8)日銷量隨時間的變化趨勢
下半年的日銷量整體上高於上半年;2011年10月5號達到日銷量的最高紀錄45741件。
(9)各國的購買訂單量和退貨訂單量的關係
購買訂單量越大的國家,退貨訂單量往往也越大。
(10)商品的平均單價與銷量的關係
總體上看,商品的銷量隨著平均單價的升高而下降。
6.參考資料
- 資料科學工具速查 | Spark使用指南(RDD版) http://www.showmeai.tech/article-detail/106
- 資料科學工具速查 | Spark使用指南(SQL版) http://www.showmeai.tech/article-detail/107
ShowMeAI相關文章推薦
- 圖解大資料 | 導論:大資料生態與應用
- 圖解大資料 | 分散式平臺:Hadoop與Map-reduce詳解
- 圖解大資料 | 實操案例:Hadoop系統搭建與環境配置
- 圖解大資料 | 實操案例:應用map-reduce進行大資料統計
- 圖解大資料 | 實操案例:Hive搭建與應用案例
- 圖解大資料 | 海量資料庫與查詢:Hive與HBase詳解
- 圖解大資料 | 大資料分析挖掘框架:Spark初步
- 圖解大資料 | Spark操作:基於RDD的大資料處理分析
- 圖解大資料 | Spark操作:基於Dataframe與SQL的大資料處理分析
- 圖解大資料 | 綜合案例:使用spark分析美國新冠肺炎疫情資料
- 圖解大資料 | 綜合案例:使用Spark分析挖掘零售交易資料
- 圖解大資料 | 綜合案例:使用Spark分析挖掘音樂專輯資料
- 圖解大資料 | 流式資料處理:Spark Streaming
- 圖解大資料 | Spark機器學習(上)-工作流與特徵工程
- 圖解大資料 | Spark機器學習(下)-建模與超參調優
- 圖解大資料 | Spark GraphFrames:基於圖的資料分析挖掘