spark機器學習-常見函數使用(pyspark版)

  • 參考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])]

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章