Pandas和Spark DataFrames 的6種不同ChinaHadoop · 2015-07-30 22:40 Spark DataFrames的代碼都在pyspark.sql package下面(很是奇怪的,歷史遺留的命名:這已經(jīng)不僅僅有關(guān)SQL的了)。 使用Pandas,您可以輕松地使用read_csv()取CSV文件。 開箱即用,Spark DataFrame支持讀取數(shù)據(jù)各種熱門的數(shù)據(jù)結(jié)構(gòu),如JSON文件,Parquet文件,Hive表 - 無論是從本地文件系統(tǒng),分布式文件系統(tǒng)(HDFS),云存儲(S3),或外部關(guān)系數(shù)據(jù)庫系統(tǒng)。 在Spark中,DataFrame是一個(gè)以命名列方式組織的分布式數(shù)據(jù)集,等同于關(guān)系型數(shù)據(jù)庫中的一個(gè)表,也相當(dāng)于R/Python中的data frames(但是進(jìn)行了更多的優(yōu)化)。DataFrames可以由結(jié)構(gòu)化數(shù)據(jù)文件轉(zhuǎn)換而來,也可以從Hive中的表得來,以及可以轉(zhuǎn)換自外部數(shù)據(jù)庫或現(xiàn) 有的RDD。 但是Spark并沒有直接支持CSV。你必須使用一個(gè)單獨(dú)的庫:Spark-CSV。 sparkDF.count() 和 pandasDF.count()并不完全一樣。 sparkDF.count() 返回?cái)?shù)據(jù)的行數(shù),而pandasDF.count()返回每列非NA/Null的數(shù)量。 而且Spark DataFrame暫時(shí)不支持.shape—Pandas中會經(jīng)常用到。 在Pandas中,為了看一個(gè)數(shù)據(jù)幀的內(nèi)容的表格視圖,您通常使用pandasDF.head(5),或pandasDF.tail(5)。在IPython Notebooks,它會顯示一個(gè)有邊界連續(xù)的漂亮數(shù)組。 在Spark中,你可以使用sparkDF.head(5),但它輸出的數(shù)據(jù)視圖比較丑陋。你應(yīng)該更喜歡sparkDF.show(5)。請注意,您不能查看最后幾行(沒有.tail()方法,由于分布式環(huán)境中計(jì)算比較復(fù)雜)。 使用Pandas,你基本上不用關(guān)心類型:Pandas會替我們自動推斷。 使用Spark DataFrames加載CSV文件,默認(rèn)的數(shù)據(jù)類型是”strings”。 要改變Spark的數(shù)據(jù)類型,可以使用.cast()法,或.astype(),它是為那些像我一樣來自Pandas用戶創(chuàng)造的一個(gè)別名)。請注意,您必須創(chuàng)建一個(gè)新列,并刪除舊的(已經(jīng)有一些改進(jìn)的方法,可以替換舊的列,但目前不能使用Python API)。 無論是Pandas還是Spark,.describe()產(chǎn)生不同的統(tǒng)計(jì)數(shù)據(jù)。然而他們有略微的不同,原因有兩個(gè): * 在Pandas,NaN值都被排除在外。在Spark,NaN值使計(jì)算均值和標(biāo)準(zhǔn)差失敗; * 標(biāo)準(zhǔn)偏差不以相同的方式計(jì)算。默認(rèn)情況下,Pandas中使用無偏(或更正)標(biāo)準(zhǔn)偏差,Spark使用未修正的標(biāo)準(zhǔn)偏差。所不同的是在分母中使用的N-1個(gè)代替N。 在機(jī)器學(xué)習(xí)中,通常是對已經(jīng)存在的列進(jìn)行積分(特征工程)產(chǎn)生新的列。在Pandas,你可以使用’[]’運(yùn)算符。在Spark你不能 - DataFrames是不可改變的。您應(yīng)該使用.withColumn()。 Spark和Pandas的DataFrames非常相似。不過,Pandas API仍然更方便,功能強(qiáng)大 - 但差距正在很快的縮小。盡管它的固有的設(shè)計(jì)約束(不變性,分布式計(jì)算,延遲計(jì)算,…),Spark想要盡可能的模仿Pandas(根據(jù)方法名)。我的猜測是,這一目標(biāo)將很快實(shí)現(xiàn)。不僅如此,Spark還有Spark.ml,模仿scikit-learn,Spark可以成為完美的一站式工業(yè)數(shù)據(jù)科學(xué)工具。 |
|