[Spark]PySpark入门学习教程---介绍(1)
一 安裝指引
(91條消息) [Hadoop] mac搭建hadoop3.X 偽分布模式_小墨魚的專欄-CSDN博客https://zengwenqi.blog.csdn.net/article/details/122427729
二 Spark基礎(chǔ)概念
Spark的核心概念
? ? ? ? ?Spark 是 UC Berkeley AMP lab 開發(fā)的一個(gè)集群計(jì)算的框架,類似于 Hadoop,但有很多的區(qū)別。最大的優(yōu)化是讓計(jì)算任務(wù)的中間結(jié)果可以存儲(chǔ)在內(nèi)存中,不需要每次都寫入 HDFS,更適用于需要迭代的 MapReduce 算法場景中,可以獲得更好的性能提升。例如一次排序測試中,對 100TB 數(shù)據(jù)進(jìn)行排序,Spark 比 Hadoop 快三倍,并且只需要十分之一的機(jī)器。Spark 集群目前最大的可以達(dá)到 8000 節(jié)點(diǎn),處理的數(shù)據(jù)達(dá)到 PB 級別,在互聯(lián)網(wǎng)企業(yè)中應(yīng)用非常廣泛。
?
Spark 的特性
Hadoop 的核心是分布式文件系統(tǒng) HDFS 和計(jì)算框架 MapReduces。Spark 可以替代 MapReduce,并且兼容 HDFS、Hive 等分布式存儲(chǔ)層,良好的融入 Hadoop 的生態(tài)系統(tǒng)。
Spark 執(zhí)行的特點(diǎn)
中間結(jié)果輸出:Spark 將執(zhí)行工作流抽象為通用的有向無環(huán)圖執(zhí)行計(jì)劃(DAG),可以將多 Stage 的任務(wù)串聯(lián)或者并行執(zhí)行。
數(shù)據(jù)格式和內(nèi)存布局:Spark 抽象出分布式內(nèi)存存儲(chǔ)結(jié)構(gòu)彈性分布式數(shù)據(jù)集 RDD,能夠控制數(shù)據(jù)在不同節(jié)點(diǎn)的分區(qū),用戶可以自定義分區(qū)策略。
任務(wù)調(diào)度的開銷:Spark 采用了事件驅(qū)動(dòng)的類庫 AKKA 來啟動(dòng)任務(wù),通過線程池的復(fù)用線程來避免系統(tǒng)啟動(dòng)和切換開銷。
?
Spark 的優(yōu)勢
- 速度快,運(yùn)行工作負(fù)載快 100 倍。Apache Spark 使用最先進(jìn)的 DAG 調(diào)度器、查詢優(yōu)化器和物理執(zhí)行引擎,實(shí)現(xiàn)了批處理和流數(shù)據(jù)的高性能。
- 易于使用,支持用 Java、Scala、Python、R 和 SQL 快速編寫應(yīng)用程序。Spark 提供了超過 80 個(gè)算子,可以輕松構(gòu)建并行應(yīng)用程序。您可以從 Scala、Python、R 和 SQL shell 中交互式地使用它。
- 普遍性,結(jié)合 SQL、流處理和復(fù)雜分析。Spark 提供了大量的庫,包括 SQL 和 DataFrames、用于機(jī)器學(xué)習(xí)的 MLlib、GraphX 和 Spark 流。您可以在同一個(gè)應(yīng)用程序中無縫地組合這些庫。
- 各種環(huán)境都可以運(yùn)行,Spark 在 Hadoop、Apache Mesos、Kubernetes、單機(jī)或云主機(jī)中運(yùn)行。它可以訪問不同的數(shù)據(jù)源。您可以使用它的獨(dú)立集群模式在 EC2、Hadoop YARN、Mesos 或 Kubernetes 上運(yùn)行 Spark。訪問 HDFS、Apache Cassandra、Apache HBase、Apache Hive 和數(shù)百個(gè)其他數(shù)據(jù)源中的數(shù)據(jù)。
Spark 生態(tài)系統(tǒng) —— BDAS
目前,Spark 已經(jīng)發(fā)展成為包含眾多子項(xiàng)目的大數(shù)據(jù)計(jì)算平臺(tái)。BDAS 是伯克利大學(xué)提出的基于 Spark 的數(shù)據(jù)分析棧(BDAS)。其核心框架是 Spark,同時(shí)涵蓋支持結(jié)構(gòu)化數(shù)據(jù) SQL 查詢與分析的查詢引擎 Spark SQL,提供機(jī)器學(xué)習(xí)功能的系統(tǒng) MLBase 及底層的分布式機(jī)器學(xué)習(xí)庫 MLlib,并行圖計(jì)算框架 GraphX,流計(jì)算框架 Spark Streaming,近似查詢引擎 BlinkDB,內(nèi)存分布式文件系統(tǒng) Tachyon,資源管理框架 Mesos 等子項(xiàng)目。這些子項(xiàng)目在 Spark 上層提供了更高層、更豐富的計(jì)算范式。
1 . Spark Core:Spark的核心組件,其操作的數(shù)據(jù)對象是RDD(彈性分布式數(shù)據(jù)集)
圖中在Spark Core上面的四個(gè)組件都依賴于Spark Core,可以簡單認(rèn)為Spark Core就是Spark生態(tài)系統(tǒng)中的離線計(jì)算框架,eg:Spark Core中提供的map,reduce算子可以完成mapreduce計(jì)算引擎所做的計(jì)算任務(wù)
2 . Spark Streaming:Spark生態(tài)系統(tǒng)中的流式計(jì)算框架,其操作的數(shù)據(jù)對象是DStream,其實(shí)Spark Streaming是將流式計(jì)算分解成一系列短小的批處理作業(yè)。這里的批處理引擎是Spark Core,也就是把Spark Streaming的輸入數(shù)據(jù)按照batch size(批次間隔時(shí)長)(如1秒)分成一段一段的數(shù)據(jù)系列(DStream),每一段數(shù)據(jù)都轉(zhuǎn)換成Spark Core中的RDD,然后將Spark Streaming中對DStream的轉(zhuǎn)換計(jì)算操作變?yōu)獒槍park中對RDD的轉(zhuǎn)換計(jì)算操作,如下官方提供的圖
在內(nèi)部實(shí)現(xiàn)上,DStream由一組時(shí)間序列上連續(xù)的RDD來表示。每個(gè)RDD都包含了自己特定時(shí)間間隔內(nèi)的數(shù)據(jù)流(如上圖中0到1秒接收到的數(shù)據(jù)成為一個(gè)RDD,1到2秒接收到的數(shù)據(jù)成為一個(gè)RDD),使用Spark Streaming對圖中DStream的操作就會(huì)轉(zhuǎn)化成使用Spark Core中的對應(yīng)算子(函數(shù))對Rdd的操作?
3 . Spark SQL:可以簡單認(rèn)為可以讓用戶使用寫SQL的方式進(jìn)行數(shù)據(jù)計(jì)算,SQL會(huì)被SQL解釋器轉(zhuǎn)化成Spark core任務(wù),讓懂SQL不懂spark的人都能通過寫SQL的方式進(jìn)行數(shù)據(jù)計(jì)算,類似于hive在Hadoop生態(tài)圈中的作用,提供SparkSql CLI(命令行界面),可以再命令行界面編寫SQL
4 . Spark Graphx:Spark生態(tài)系統(tǒng)中的圖計(jì)算和并行圖計(jì)算,目前較新版本已支持PageRank、數(shù)三角形、最大連通圖和最短路徑等6種經(jīng)典的圖算法
5 . Spark Mlib:一個(gè)可擴(kuò)展的Spark機(jī)器學(xué)習(xí)庫,里面封裝了很多通用的算法,包括二元分類、線性回歸、聚類、協(xié)同過濾等。用于機(jī)器學(xué)習(xí)和統(tǒng)計(jì)等場景
Q1: 什么是RDD
RDD的全稱是 Resilient Distributed Datasets,這是Spark的一種數(shù)據(jù)抽象集合,它可以被執(zhí)行在分布式的集群上進(jìn)行各種操作,而且有較強(qiáng)的容錯(cuò)機(jī)制。RDD可以被分為若干個(gè)分區(qū),每一個(gè)分區(qū)就是一個(gè)數(shù)據(jù)集片段,從而可以支持分布式計(jì)算。它們是在多個(gè)節(jié)點(diǎn)上運(yùn)行和操作以在集群上進(jìn)行并行處理的元素。RDD是不可變元素,這意味著一旦創(chuàng)建了RDD,就無法對其進(jìn)行更改。RDD也具有容錯(cuò)能力,因此在發(fā)生任何故障時(shí),它們會(huì)自動(dòng)恢復(fù)。您可以對這些RDD應(yīng)用多個(gè)操作來完成某項(xiàng)任務(wù)。
Q2: RDD運(yùn)行時(shí)相關(guān)的關(guān)鍵名詞
簡單來說可以有 Client、Job、Master、Worker、Driver、Stage、Task以及Executor,這幾個(gè)東西在調(diào)優(yōu)的時(shí)候也會(huì)經(jīng)常遇到的。
Client:指的是客戶端進(jìn)程,主要負(fù)責(zé)提交job到Master;
Job:Job來自于我們編寫的程序,Application包含一個(gè)或者多個(gè)job,job包含各種RDD操作;
Master:指的是Standalone模式中的主控節(jié)點(diǎn),負(fù)責(zé)接收來自Client的job,并管理著worker,可以給worker分配任務(wù)和資源(主要是driver和executor資源);
Worker:指的是Standalone模式中的slave節(jié)點(diǎn),負(fù)責(zé)管理本節(jié)點(diǎn)的資源,同時(shí)受Master管理,需要定期給Master回報(bào)heartbeat(心跳),啟動(dòng)Driver和Executor;
Driver:指的是 job(作業(yè))的主進(jìn)程,一般每個(gè)Spark作業(yè)都會(huì)有一個(gè)Driver進(jìn)程,負(fù)責(zé)整個(gè)作業(yè)的運(yùn)行,包括了job的解析、Stage的生成、調(diào)度Task到Executor上去執(zhí)行;
Stage:中文名 階段,是job的基本調(diào)度單位,因?yàn)槊總€(gè)job會(huì)分成若干組Task,每組任務(wù)就被稱為 Stage;
Task:任務(wù),指的是直接運(yùn)行在executor上的東西,是executor上的一個(gè)線程;
Executor:指的是 執(zhí)行器,顧名思義就是真正執(zhí)行任務(wù)的地方了,一個(gè)集群可以被配置若干個(gè)Executor,每個(gè)Executor接收來自Driver的Task,并執(zhí)行它(可同時(shí)執(zhí)行多個(gè)Task)。
Q3: 什么是DAG
全稱是 Directed Acyclic Graph,中文名是有向無環(huán)圖。Spark就是借用了DAG對RDD之間的關(guān)系進(jìn)行了建模,用來描述RDD之間的因果依賴關(guān)系。因?yàn)樵谝粋€(gè)Spark作業(yè)調(diào)度中,多個(gè)作業(yè)任務(wù)之間也是相互依賴的,有些任務(wù)需要在一些任務(wù)執(zhí)行完成了才可以執(zhí)行的。在Spark調(diào)度中就是有DAG scheduler,它負(fù)責(zé)將job分成若干組Task組成的Stage。
Q4: Spark的部署模式有哪些
主要有local模式、Standalone模式、Mesos模式、YARN模式。
- Standalone: 獨(dú)立模式,Spark 原生的簡單集群管理器, 自帶完整的服務(wù), 可單獨(dú)部署到一個(gè)集群中,無需依賴任何其他資源管理系統(tǒng), 使用 Standalone 可以很方便地搭建一個(gè)集群,一般在公司內(nèi)部沒有搭建其他資源管理框架的時(shí)候才會(huì)使用。
- Mesos:一個(gè)強(qiáng)大的分布式資源管理框架,它允許多種不同的框架部署在其上,包括 yarn.
- YARN: 統(tǒng)一的資源管理機(jī)制, 在上面可以運(yùn)行多套計(jì)算框架, 如map reduce、storm 等, 根據(jù) driver 在集群中的位置不同,分為 yarn client 和 yarn cluster。
實(shí)際上Spark內(nèi)部為了方便用戶測試,自身也提供了一些部署模式。由于在實(shí)際工廠環(huán)境下使用的絕大多數(shù)的集群管理器是 Hadoop YARN,因此我們關(guān)注的重點(diǎn)是 Hadoop YARN 模式下的 Spark 集群部署。
用戶在提交任務(wù)給 Spark 處理時(shí),以下兩個(gè)參數(shù)共同決定了 Spark 的運(yùn)行方式。
·– master MASTER_URL :決定了 Spark 任務(wù)提交給哪種集群處理。
·– deploy-mode DEPLOY_MODE:決定了 Driver 的運(yùn)行方式,可選值為 Client或者 Cluster。
Q5: Shuffle操作是什么
Shuffle指的是數(shù)據(jù)從Map端到Reduce端的數(shù)據(jù)傳輸過程,Shuffle性能的高低直接會(huì)影響程序的性能。因?yàn)镽educe task需要跨節(jié)點(diǎn)去拉在分布在不同節(jié)點(diǎn)上的Map task計(jì)算結(jié)果,這一個(gè)過程是需要有磁盤IO消耗以及數(shù)據(jù)網(wǎng)絡(luò)傳輸?shù)南牡?#xff0c;所以需要根據(jù)實(shí)際數(shù)據(jù)情況進(jìn)行適當(dāng)調(diào)整。另外,Shuffle可以分為兩部分,分別是Map階段的數(shù)據(jù)準(zhǔn)備與Reduce階段的數(shù)據(jù)拷貝處理,在Map端我們叫Shuffle Write,在Reduce端我們叫Shuffle Read。
Q6: 什么是惰性執(zhí)行
這是RDD的一個(gè)特性,在RDD中的算子可以分為Transformation算子和Action算子,其中Transformation算子的操作都不會(huì)真正執(zhí)行,只會(huì)記錄一下依賴關(guān)系,直到遇見了Action算子,在這之前的所有Transform操作才會(huì)被觸發(fā)計(jì)算,這就是所謂的惰性執(zhí)行。具體哪些是Transformation和Action算子,可以看下一節(jié)。
三 Spark與Pyspark架構(gòu)
Spark集群由Driver, Cluster Manager(Standalone,Yarn 或 Mesos),以及Worker Node組成。對于每個(gè)Spark應(yīng)用程序,Worker Node上存在一個(gè)Executor進(jìn)程,Executor進(jìn)程中包括多個(gè)Task線程。
對于pyspark,為了不破壞Spark已有的運(yùn)行時(shí)架構(gòu),Spark在外圍包裝一層Python API。在Driver端,借助Py4j實(shí)現(xiàn)Python和Java的交互,進(jìn)而實(shí)現(xiàn)通過Python編寫Spark應(yīng)用程序。在Executor端,則不需要借助Py4j,因?yàn)镋xecutor端運(yùn)行的Task邏輯是由Driver發(fā)過來的,那是序列化后的字節(jié)碼。
其中白色部分是新增的Python進(jìn)程,在Driver端,通過Py4j實(shí)現(xiàn)在Python中調(diào)用Java的方法,即將用戶寫的PySpark程序”映射”到JVM中.
例如,用戶在PySpark中實(shí)例化一個(gè)Python的SparkContext對象,最終會(huì)在JVM中實(shí)例化Scala的SparkContext對象;在Executor端,則不需要借助Py4j,因?yàn)镋xecutor端運(yùn)行的Task邏輯是由Driver發(fā)過來的,那是序列化后的字節(jié)碼,雖然里面可能包含有用戶定義的Python函數(shù)或Lambda表達(dá)式,Py4j并不能實(shí)現(xiàn)在Java里調(diào)用Python的方法,為了能在Executor端運(yùn)行用戶定義的Python函數(shù)或Lambda表達(dá)式,則需要為每個(gè)Task單獨(dú)啟一個(gè)Python進(jìn)程,通過socket通信方式將Python函數(shù)或Lambda表達(dá)式發(fā)給Python進(jìn)程執(zhí)行。
語言層面的交互總體流程如下圖所示,實(shí)線表示方法調(diào)用,虛線表示結(jié)果返回。
四 PySpark簡介
Apache Spark是用Scala編程語言編寫的。為了用Spark支持Python,Apache Spark社區(qū)發(fā)布了一個(gè)工具PySpark。使用PySpark,您也可以使用Python編程語言處理RDD。正是由于一個(gè)名為Py4j的庫,他們才能實(shí)現(xiàn)這一目標(biāo)。
運(yùn)行pyspark的方式
pyspark主要通過以下一些方式運(yùn)行。
1 通過pyspark進(jìn)入pyspark單機(jī)交互式環(huán)境。
這種方式一般用來測試代碼。
也可以指定jupyter或者ipython為交互環(huán)境。
2 通過spark-submit提交Spark任務(wù)到集群運(yùn)行。
這種方式可以提交Python腳本或者Jar包到集群上讓成百上千個(gè)機(jī)器運(yùn)行任務(wù)。
這也是工業(yè)界生產(chǎn)中通常使用spark的方式。
3 Python安裝findspark和pyspark庫。
可以在jupyter和其它Python環(huán)境中像調(diào)用普通庫一樣地調(diào)用pyspark庫。
這也是本書配置pyspark練習(xí)環(huán)境的方式。
通過spark-submit提交任務(wù)到集群運(yùn)行常見問題
以下為在集群上運(yùn)行pyspark時(shí)相關(guān)的一些問題,
1,pyspark是否能夠調(diào)用Scala或者Java開發(fā)的jar包?
答:只有Driver中能夠調(diào)用jar包,通過Py4J進(jìn)行調(diào)用,在executors中無法調(diào)用。
2,pyspark如何在excutors中安裝諸如pandas,numpy等包?
答:可以通過conda建立Python環(huán)境,然后將其壓縮成zip文件上傳到hdfs中,并在提交任務(wù)時(shí)指定環(huán)境。
當(dāng)然,最簡單直接的方案是把你想要的anaconda環(huán)境打包成zip上傳到集群hdfs環(huán)境中。注意,你打包的機(jī)器應(yīng)當(dāng)和集群的機(jī)器具有相同的linux操作系統(tǒng)。
3,pyspark如何添加自己編寫的其它Python腳本到excutors中的PYTHONPATH中?
答:可以用py-files參數(shù)設(shè)置,可以添加.py,.egg 或者壓縮成.zip的Python腳本,在excutors中可以import它們。
4,pyspark如何添加一些配置文件到各個(gè)excutors中的工作路徑中?
答:可以用files參數(shù)設(shè)置,不同文件名之間以逗號分隔,在excutors中用SparkFiles.get(fileName)獲取。
pyspark spark-submit 集群提交任務(wù)以及引入虛擬環(huán)境依賴包攻略:https://www.cnblogs.com/piperck/p/10121097.html
PySpark - SparkContext
SparkContext是任何spark功能的入口點(diǎn)。當(dāng)我們運(yùn)行任何Spark應(yīng)用程序時(shí),會(huì)啟動(dòng)一個(gè)驅(qū)動(dòng)程序,它具有main函數(shù),并且此處啟動(dòng)了SparkContext。然后,驅(qū)動(dòng)程序在工作節(jié)點(diǎn)上的執(zhí)行程序內(nèi)運(yùn)行操作。
SparkContext使用Py4J啟動(dòng)JVM并創(chuàng)建JavaSparkContext。默認(rèn)情況下,PySpark將SparkContext作為'sc'提供,因此創(chuàng)建新的SparkContext將不起作用。
以下代碼塊包含PySpark類的詳細(xì)信息以及SparkContext可以采用的參數(shù)。
class pyspark.SparkContext (master = None,appName = None, sparkHome = None, pyFiles = None, environment = None, batchSize = 0, serializer = PickleSerializer(), conf = None, gateway = None, jsc = None, profiler_cls = <class 'pyspark.profiler.BasicProfiler'> )以下是SparkContext的參數(shù)具體含義:
- Master- 它是連接到的集群的URL。
- appName- 您的工作名稱。
- sparkHome - Spark安裝目錄。
- pyFiles - 要發(fā)送到集群并添加到PYTHONPATH的.zip或.py文件。
- environment - 工作節(jié)點(diǎn)環(huán)境變量。
- batchSize - 表示為單個(gè)Java對象的Python對象的數(shù)量。設(shè)置1以禁用批處理,設(shè)置0以根據(jù)對象大小自動(dòng)選擇批處理大小,或設(shè)置為-1以使用無限批處理大小。
- serializer- RDD序列化器。
- Conf - L {SparkConf}的一個(gè)對象,用于設(shè)置所有Spark屬性。
- gateway - 使用現(xiàn)有網(wǎng)關(guān)和JVM,否則初始化新JVM。
- JSC - JavaSparkContext實(shí)例。
- profiler_cls - 用于進(jìn)行性能分析的一類自定義Profiler(默認(rèn)為pyspark.profiler.BasicProfiler)
在上述參數(shù)中,主要使用master和appname。任何PySpark程序的會(huì)使用以下兩行:
from pyspark import SparkContext sc = SparkContext("local", "Hello Pyspark")3.1 SparkContext示例 - PySpark Shell
現(xiàn)在你對SparkContext有了足夠的了解,讓我們在PySpark shell上運(yùn)行一個(gè)簡單的例子。在這個(gè)例子中,我們將計(jì)算README.md文件中帶有字符“a”或“b”的行數(shù)。那么,讓我們說如果一個(gè)文件中有5行,3行有字符'a',那么輸出將是→ Line with a:3。字符'b'也是如此。
我們不會(huì)在以下示例中創(chuàng)建任何SparkContext對象,因?yàn)槟J(rèn)情況下,當(dāng)PySpark shell啟動(dòng)時(shí),Spark會(huì)自動(dòng)創(chuàng)建名為sc的SparkContext對象。如果您嘗試創(chuàng)建另一個(gè)SparkContext對象,您將收到以下錯(cuò)誤 - “ValueError:無法一次運(yùn)行多個(gè)SparkContexts”。
在終端輸入pyspark 啟動(dòng)PySpark Shell:
>>> logFile="file:user/local/hadoop-2.8.5/README.txt" >>> logData=sc.textFile(logFile).cache() >>> numAs=logData.filter(lambda s:'a' in s).count() >>> numBs=logData.filter(lambda s:'b' in s).count() >>> print("Line with a:%i,line with b:%i" % (numAs,numBs)) Line with a:20, line with b:103.2 SparkContext示例 - Python程序
讓我們使用Python程序運(yùn)行相同的示例。創(chuàng)建一個(gè)名為demo.py的Python文件,并在該文件中輸入以下代碼。
from pyspark import SparkContext logFile = "file:usr/local/hadoop-2.8.5/README.txt" sc = SparkContext("local", "Hello PySpark") logData = sc.textFile(logFile).cache() numAs = logData.filter(lambda s: 'a' in s).count() numBs = logData.filter(lambda s: 'b' in s).count() print("Line with a:%i,lines with b :%i" % (numAs, numBs))然后我們將在終端中執(zhí)行以下命令來運(yùn)行此Python文件。我們將得到與上面相同的輸出。
spark-submit demo.py3.3?Spark -- WordCount詞頻統(tǒng)計(jì)
# -*- coding: utf-8 -*- import sys import os import datetime from pyspark import SparkConf,SparkContextsc = SparkConf().setAppName("wordcount") spark = SparkContext(conf=sc)text_file = spark.textFile("hdfs://examples/pyspark/words.txt") word_cnt_rdd = text_file.flatMap(lambda line : line.split(' ')).map(lambda word : (word, 1)).reduceByKey(lambda x, y: x + y) word_cnt_rdd.saveAsTextFile('hdfs://user/wordcount_result') #spark-cluster-mode ./spark-submit \ --verbose \ --master yarn \ --deploy-mode cluster \ --num-executors 10 \ --executor-cores 1 \ --executor-memory 8G \ --driver-memory 4G \ --conf spark.pyspark.python=python3 \ wordcount.py#spark-client-mode ./spark-submit \ --verbose \ --master yarn \ --deploy-mode client \ --num-executors 10 \ --executor-cores 1 \ --executor-memory 8G \ --driver-memory 4G \ --conf spark.pyspark.python=python3 \ --conf spark.pyspark.driver.python=python3 \ wordcount.py學(xué)習(xí)資源推薦:
1)edureka about PySpark Tutorial
印度老哥的課程,B站可直接看,不過口音略難聽懂不過還好有字幕。
https://www.bilibili.com/video/BV1i4411i79a?p=1
2)10天吃掉那只pyspark - Heywhale.com
https://github.com/lyhue1991/eat_pyspark_in_10_days
3)官方文檔
PySpark Documentation — PySpark 3.2.0 documentation
PySpark Tutorial
全面解析Spark,以及和Python的對接?
Spark的三種集群部署模式
大數(shù)據(jù)入門與實(shí)戰(zhàn)-PySpark的使用教程
Mac下安裝spark,并配置pycharm-pyspark完整教程
https://blog.csdn.net/shiyutianming/article/details/99946797
總結(jié)
以上是生活随笔為你收集整理的[Spark]PySpark入门学习教程---介绍(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [机器学习] LightGBM on S
- 下一篇: 阿里云盘 4.1.1 版本 iOS 小组