Spark原理
1.spark是跟mr同等级别的计算框架,不提供源数据存储功能。
2.数据存储在hdfs上或其他分布式系统上,若只有一个csv放在单机上,其他slave节点读取不到文件,无法创建rdd会导致任务执行失败。
Spark使用
udf
传入一个字符串代表一列,udf中自动遍历每个值,不需要自己写遍历函数,只需当作传入的为一行数据即可。
条件选择
DF.withColumn(“FLG”, when((col(“FLG1”)‘T’) & ((col(“FLG2”)‘F’) | (col(“FLG2”)==‘T’)),lit(‘F’)).otherwise(lit(‘T’))).show()
条件join
join条件可以是on = a>b
rdd转字典
df = spark.createDataFrame(pd.DataFrame([1, 1, 2, 5, 5, 5, 6], columns=[‘MYCOLUMN’]))
df_count = df.groupby(‘MYCOLUMN’).count().sort(‘MYCOLUMN’)
dict(df_count.rdd.map(lambda x: (x[‘MYCOLUMN’], x[‘count’])).collect())
分组计算
https://blog.youkuaiyun.com/lanyuelvyun/article/details/109244033
from pyspark.sql import SparkSession # SparkConf、SparkContext 和 SQLContext 都已经被封装在 SparkSession
from pyspark.sql import functions as F
from pyspark.sql import Window
from pyspark.sql import Row
from pyspark.sql import types as T # spark df的数据类型
import pandas as pd
import numpy as np
from sklearn import metrics
载入模型分:从本地导入,并转换成spark_df
df = pd.read_csv(r’model_pvalue.csv’, sep=’,’)
spark_df = spark.createDataFrame(df)
自定义函数(计算AUC),并且变成UDF
“”“注意:自定义函数的重点在于定义返回值的数据类型,这个返回值的数据类型必须与该函数return值的数据类型一致,否则会报错。
该例子中,该函数return的值auc,是string类型,在将该函数定义成udf的时候,指定的返回值类型,也必须是string!!”""
def get_auc(label, pvalue):
auc = str(metrics.roc_auc_score(label, pvalue)) # 如果不知道是什么类型,就显示的强制转换成需要的数据类型,比如说使用str()
return auc
get_auc_udfs = F.udf(get_auc, returnType=T.StringType()) # 定义成udf,并且此udf的返回值类型为string
分组聚合操作:分别计算每月样本量、逾期率、AUC
https://blog.youkuaiyun.com/lanyuelvyun/article/details/109244033:
“”“使用上面定义的UDF,结合F.collect_list(col)来实现UDAF的功能。
F.collect_lits(col)的作用是将列col的值变成一个list返回.”""
df_result = df_v12_online.groupby(‘apply_month’).
agg(
F.count(‘uid’).alias(‘uid_cnt’)
,F.mean(‘label’).alias(‘bad_rate’) #pyspark自有的聚合函数F.mean()的使用方法
,get_auc_udfs(F.collect_list(F.col(‘label’).cast(‘int’)), F.collect_list(F.col(‘model_pvalue’).cast(‘float’))).alias(‘auc’) #利用自定的UDF,实现指定聚合计算
)
df_result.show()
https://blog.youkuaiyun.com/qq_42363032/article/details/118298108:
def row_dealwith(data):
ids = list(data.keys())[0]
values = data.get(ids)
# print(ids, values[0], values[1])
print(ids, len(values[0]))
print()
dardds.foreach(row_dealwith)