pyspark
pyspark的一些函数:
1.我们可以将.withcolumn与PySpark SQL函数一起使用来创建新列。 本质上,您可以找到已经使用Spark函数实现的String函数,Date函数和Math函数。 我们可以将spark函数导入为:
import pyspark.sql.functions as F
我们的第一个函数F.col函数使我们可以访问列。 因此,如果我们想将一栏乘以2,可以将F.col用作:
ratings_with_scale10 = ratings.withColumn("ScaledRating", 2*F.col("rating"))
ratings_with_scale10.show()
2.我们还可以使用数学函数,例如F.exp函数:
ratings_with_exp = ratings.withColumn("expRating", 2*F.exp("rating"))
ratings_with_exp.show()
3.自定义udf来处理
要使用Spark UDF,我们需要使用F.udf函数将常规的python函数转换为Spark UDF。 我们还需要指定函数的返回类型。 在此示例中,返回类型为StringType()
import pyspark.sql.functions as F
from pyspark.sql.types import *
def somefunc(value):
if value < 3:
return 'low'
else:
return 'high'
#convert to a UDF Function by passing in the function and return type of function
udfsomefunc = F.udf(somefunc, StringType())
ratings_with_high_low = ratings.withColumn("high_low", udfsomefunc("rating"))
ratings_with_high_low.show()
4.使用SQL
对于喜欢SQL的人,甚至可以使用SQL创建列。 为此,我们需要注册一个临时SQL表,然后使用带有附加列的简单选择查询。 一个人也可以用它来进行联接。
ratings.registerTempTable('ratings_table')
newDF = sqlContext.sql('select *, 2*rating as newCol from ratings_table')
newDF.show()
5.使用RDD
有时,Spark UDF和SQL函数对于特定用例而言都是不够的。 您可能想利用Spark RDD获得的更好的分区。 或者,您可能想在Spark RDD中使用组函数。 您可以使用此方法,主要是在需要访问python函数内部spark数据框中的所有列时。
无论如何,我发现使用RDD创建新列的这种方式对于有经验的RDD(这是Spark生态系统的基本组成部分)的人们非常有用。
下面的过程利用该功能在Row和pythondict对象之间进行转换。 我们将行对象转换为字典。 按照我们的习惯使用字典,然后将该字典再次转换回行。
import math
from pyspark.sql import Row
def rowwise_function(row):
# convert row to dict:
row_dict = row.asDict()
# Add a new key in the dictionary with the new column name and value.
row_dict['Newcol'] = math.exp(row_dict['rating'])
# convert dict to row:
newrow = Row(**row_dict)
# return new row
return newrow
# convert ratings dataframe to RDD
ratings_rdd = ratings.rdd
# apply our function to RDD
ratings_rdd_new = ratings_rdd.map(lambda row: rowwise_function(row))
# Convert RDD Back to DataFrame
ratings_new_df = sqlContext.createDataFrame(ratings_rdd_new)
ratings_new_df.show()
样例:
1. main
2. addSampleLabel
我们先对历史评分数据进行统计分析:
查看历史评分发布,并发现最大比例再 3.0分 和 4.0分:
我们将评分3.5及以上的视为用户喜欢该电影,是正样本,反之为负样本:
3. addMovieFeatures
3.1 年份特征
其中 extractReleaseYearUdf 是从 title 中截取出年份:
3.2 电影类型特征
取前3个类型标签作为特征:
3.3 评分特征
统计各电影对评分数、平均评分、评分标准差
4. addUserFeatures
用户部分,我们主要对历史近100条数据内的用户观影行为进行相关的特征处理。如最近评分的电影、评分过的电影数、评分过的电影年份、历史评分、最近看过的电影类型等:
split Train&Test Samples
随机划分:
按时间先后划分:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程