- 參考spark機器學習,稍微加些自己的操作
- 基於pycharm進行開發,pyspark安裝見上篇博文
- 數據集包含的字段爲:id,年齡,性別,職業,郵編
- 數據集連接在:http://files.grouplens.org/datasets/movielens/ml-100k.zip
- 涉及的計算函數包含:
- textFile
- count
- first
- map
- reduce
- distinct
- reduceByKey
- countByValue
from pyspark import SparkContext,SparkConf
#
conf = SparkConf().setAppName("test").setMaster("local")
sc = SparkContext(conf=conf)
# 讀取文件
data=sc.textFile("/Users/hqh/pycharm/機器學習/pyspark/ml-100k/u.user")
# 統計總的記錄數
print(data.count())
# 觀察第一條數據
print(data.first()) # 分別對應 id,年齡,性別,職業,郵編
# 統計其中一個字段的職業的去重數量
print(data.map(lambda x:x.split("|")[3]).distinct().count())
# 分佈圖
import matplotlib.pyplot as plt
ages=data.map(lambda x:int(x.split("|")[1])).collect()
plt.hist(ages,bins=20,color='blue',density=True) # density參數表示y軸顯示的爲佔比
plt.show()
# 職業分佈情況
zydist=data.map(lambda x:x.split("|")[3]).map(lambda x:(x,1)).reduceByKey(lambda x,y:x+y).collect()
print(zydist) # 返回的是一個list,裏面的元素爲tuple
## 直接使用countByValue,
zydist1=data.map(lambda x:x.split("|")[3]).countByValue()
print(dict(zydist1)) # 返回的是一個dict
- 涉及函數
- groupByKey
- reduceByKey
- sortBy
- Udf的使用
# 自定義函數並轉換
ts=data.map(lambda x:int(x.split("\t")[3]))
import datetime
def format_ts(ts):
'''
將時間戳格式化,並根據小時,轉化爲上午,中午,下午,晚上
:param ts:
:return:
'''
temp=datetime.datetime.fromtimestamp(ts)
if temp.hour in range(1,10):
return "早上"
elif temp.hour in range(10,14):
return "中午"
elif temp.hour in range(14,18):
return "下午"
else:
return "晚上"
ts=ts.map(lambda x:format_ts(x))
print(ts.collect())
- 涉及函數
- zipWithIndex 詞與下標的映射關係
- collectAsMap 返回一個dict
import jieba
test=["我的名字叫做推推","我出身在浙江溫州","我是碩士學歷"]
test=sc.parallelize(test,2)
def conv2index(text):
return list(jieba.cut(text))
# 建立詞的字典
res=test.flatMap(lambda x:conv2index(x)).zipWithIndex().collectAsMap()
print(res)
- 正則化-Normalizer
from pyspark.mllib.feature import Normalizer
seq=sc.parallelize([range(1,11)],2)
normalizer=Normalizer()
print(normalizer.transform(seq).collect())
#[DenseVector([0.051, 0.1019, 0.1529, 0.2039, 0.2548, 0.3058, 0.3568, 0.4077, 0.4587, 0.5096])]