pyspark常用操作

加載 讀取數(shù)據(jù)

from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('data_processing').getOrCreate()
df = spark.read_csv('data.csv',inferSchema=True,header=True) # inferSchema用于自行推斷數(shù)據(jù)類型
-------------
df.columns #查看列名
(df.count,len(df.columns))#查看形狀
df.printSchema() #類似info
df.show(5) #類似head
df.select('age','name').show()
df.describe().show()
-------------

添加一列新列

df = df.withColumn('age_after_10_years',(df['age']+10))

轉換數(shù)據(jù)類型

from pyspark.sql.types import StringType,DoubleType
df['age'].cast(DoubleType())
-------------

篩選數(shù)據(jù)

df.filter(df['age']==20).show()
df.filter((df['age']==20) & (df['name']=='biob')).show()
求unique
df.select('name').distinct().show()
-------------

數(shù)據(jù)分組

df.groupBy('age').count().orderBy('age',ascending=False).show()
df.groupBy('age').mean() #返回 所有除去age的其他列的mean值
聚合
df.groupBy('age').agg({'salary':'sum'})
------------

自定義函數(shù)

from pyspark.sql.function import udf
def func():
    ***
    ***
    return **
UDF = udf(func,StringType())  #func的返回指的類型 可以是 StringType 也可以是 IntegerType() 看具體情況
df.withColumn('salary_new',UDF(df['salary']))  #新加一列 對df['salary'] 進行定義的函數(shù)操作
-----------
UDF = udf(lambda x:....,StringType())
df.withColumn('salary_new',UDF(df['salary']))
-----------

使用pandas_udf速度更快

from pyspark.sql.function import pandas_udf
def func():
    ...
UDF = pandas_udf(func,IntegerType())
df.withColumn(df['name'],UDF(df['name']))

函數(shù)的方法也可適用于多列

-----------

去重

df = df.dropDuplicates()
-----------

刪除列

df = df.drop('salary')

寫入數(shù)據(jù) csv格式

path = 'result/train'
df.coalesce(1).write.format('csv').option('header','true').save(path)
-----------

寫入數(shù)據(jù) 嵌套結構 適用于數(shù)據(jù)集特別大 可以對其進行壓縮

path = 'result/train'
df.write.format('parquet').save(path)
------------

多列特征合并

from  pyspark.ml.linalg import Vector
from pyspark.ml.feature import VectorAssembler #VectorAssembler可將所有的特征匯成一列特征  

vec_assembler = VectorAssembler(inputCols=['city','career','age','gender'],outputCol='people_feature')
df = vec_assembler.transform(df)
-----------

劃分數(shù)據(jù)集

train,test = df.randomSplit([0.8,0.2])
-----------
from pyspark.ml.regression import LinearRegression
linear_reg = LinearRegression(labelCol='label')
model = linear_reg.fit(train)
model_ = model.evaluate(train)
r2 = model_.r2 #還可以取更多的指標

res = model.evaluate(test).predictions
-----------

特征工程

from spark.ml.feature import StringIndexer  #類似于sklearn 的 label encoder
from spark.ml.feature import OneHotEncoder
from spark.ml.feature import VectorAssembler

df = StringIndexer(inputCol='city',outputCol='city_').fit_transform(df)
-----------

查看數(shù)據(jù)分布 這里用不了value_counts

df.groupBy('label').count().show()
-----------
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.classification import RandomForestClassifier

model = RandomForestClassifier(labelCol='label',numTrees=50).fit(train)
-----------

查看準確率 精度 auc

from spark.ml.evaluation import MulticlassClassificationEvaluator
from spark.ml.evaluation import BinaryClassificationEvaluator

predictions = model.transform(test)
accuracy = MulticlassClassificationEvaluator(labelCol='label',metricName='accuracy').evaluate(predictions) # metricName = 'weightedPrecision' 精度

auc = BinaryClassificationEvaluator(labelCol='label').evaluate(predictions)
----------

推薦算法  ALS(基于矩陣分解的一種方法)

from pyspark.ml.recommendation import ALS
rec = ALS(maxIter=10, regParam=0.01, userCol='userID', itemCol='itemID', ratingCol='rating', nonnegative=True, coldStartStrategy='drop')

其中 nonnegative 表示 不會在推薦系統(tǒng)中創(chuàng)建負數(shù)評分  coldStartStrategy可以防止生成任何nan評分預測
-----------
rec_model = rec.fit(train)
predicted_ratings = rec_model.transfrom(train)

from pyspark.ml.evaluation import RegressionEvaluator
evaluator = RegressionEvaluator(metricName='rmse',predictionCol='prediction',labelCol='rating')
rmase = evaluator.evaluate(predicted_ratings)

進行到這一步還沒有完成推薦  只是完成了對測試集用戶評分的預測 
-----------

接下來
推薦用戶可能喜歡的排名靠前的電影 
先創(chuàng)建一系列獨立的電影
unique_movies = df.select('movie').distinct()

假如我們對一位特定的userid 推薦電影  先過濾掉 他看過的電影
watched_movies = df.filter(df['userid']==userid).select('movie').distinct()
-----------

然后通過合并兩張表 過濾空值 找出可以推薦的電影

total_movies = unique_movies.join(watched_movies,unique_movies.movie == watched_movies.movie)
remaining_movies = total_movies.where(col('watched_movies.movie').isNull()).select(unique.movies).distinct()
-----------

然后再用之前的模型對其進行評分預測 

recommendations = rec_model.transform(remaing_movies).orderBy('prediction',ascending=False)

之后還可以用 IndexToString 反變換  把推薦的電影數(shù)字 映射為 電影名字

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末遍愿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌府寒,老刑警劉巖磷瘤,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件春缕,死亡現(xiàn)場離奇詭異私植,居然都是意外死亡,警方通過查閱死者的電腦和手機徘六,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門内边,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人待锈,你說我怎么就攤上這事漠其。” “怎么了竿音?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵辉懒,是天一觀的道長。 經(jīng)常有香客問我谍失,道長,這世上最難降的妖魔是什么莹汤? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任快鱼,我火速辦了婚禮,結果婚禮上纲岭,老公的妹妹穿的比我還像新娘抹竹。我一直安慰自己,他們只是感情好止潮,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布窃判。 她就那樣靜靜地躺著,像睡著了一般喇闸。 火紅的嫁衣襯著肌膚如雪袄琳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天燃乍,我揣著相機與錄音唆樊,去河邊找鬼。 笑死刻蟹,一個胖子當著我的面吹牛逗旁,可吹牛的內容都是我干的。 我是一名探鬼主播舆瘪,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼片效,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了英古?” 一聲冷哼從身側響起淀衣,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哺呜,沒想到半個月后舌缤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體箕戳,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年国撵,在試婚紗的時候發(fā)現(xiàn)自己被綠了陵吸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡介牙,死狀恐怖壮虫,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情环础,我是刑警寧澤囚似,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站线得,受9級特大地震影響饶唤,放射性物質發(fā)生泄漏。R本人自食惡果不足惜贯钩,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一募狂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧角雷,春花似錦祸穷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吗坚,卻和暖如春祈远,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刻蚯。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工绊含, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炊汹。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓躬充,卻偏偏與公主長得像,于是被迫代替她去往敵國和親讨便。 傳聞我的和親對象是個殘疾皇子充甚,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容