数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
三、转换操作
转换操作(
transformation
) 会从一个RDD
生成一个新的RDD
- 在这个过程中并不会求值。求值发生在
action
操作中 - 在这个过程中并不会改变输入的
RDD
(RDD
是不可变的),而是创建并返回一个新的RDD
- 在这个过程中并不会求值。求值发生在
spark
会使用谱系图来记录各个RDD
之间的依赖关系- 在对
RDD
行动操作中,需要这个依赖关系来按需计算每个中间RDD
- 当持久化的
RDD
丢失部分数据时,也需要这个依赖关系来恢复丢失的数据
- 在对
3.1 通用转换操作
基本转换操作:
.map(f, preservesPartitioning=False)
:将函数f
作用于当前RDD
的每个元素,返回值构成新的RDD
。preservesPartitioning
:如果为True
,则新的RDD
保留旧RDD
的分区
.flatMap(f, preservesPartitioning=False)
:将函数f
作用于当前RDD
的每个元素,将返回的迭代器的内容构成了新的RDD
。flatMap
可以视作:将返回的迭代器扁平化
xxxxxxxxxx
lines = sc.parallelize(['hello world','hi']) lines.map(lambda line:line.split(" ")) #新的RDD元素为[['hello','world'],['hi',]] lines.flatMap(lambda line:line.split(" ")) #新的RDD元素为 ['hello','word','hi'].mapPartitions(f, preservesPartitioning=False)
:将函数f
作用于当前RDD
的每个分区,将返回的迭代器的内容构成了新的RDD
。这里
f
函数的参数是一个集合(表示一个分区的数据).mapPartitionsWithIndex(f, preservesPartitioning=False)
:将函数f
作用于当前RDD
的每个分区以及分区id
,将返回的迭代器的内容构成了新的RDD
。- 这里
f
函数的参数是f分区id
以及一个集合(表示一个分区的数据)
示例:
xxxxxxxxxx
def f(splitIndex, iterator): xxx rdd.mapPartitionsWithIndex(f)- 这里
.filter(f)
:将函数f
(称作过滤器) 作用于当前RDD
的每个元素,通过f
的那些元素构成新的RDD
.distinct(numPartitions=None)
:返回一个由当前RDD
元素去重之后的结果组成新的RDD
。numPartitions
:指定了新的RDD
的分区数
sample(withReplacement, fraction, seed=None)
:对当前RDD
进行采样,采样结果组成新的RDD
withReplacement
:如果为True
,则可以重复采样;否则是无放回采样fractions
:新的RDD
的期望大小(占旧RDD
的比例)。spark
并不保证结果刚好满足这个比例(只是一个期望值)- 如果
withReplacement=True
:则表示每个元素期望被选择的次数 - 如果
withReplacement=False
:则表示每个元素期望被选择的概率
- 如果
seed
:随机数生成器的种子
.sortBy(keyfunc, ascending=True, numPartitions=None)
:对当前RDD
进行排序,排序结果组成新的RDD
keyfunc
:自定义的比较函数ascending
:如果为True
,则升序排列
.glom()
:返回一个RDD
,它将旧RDD
每个分区的元素聚合成一个列表,作为新RDD
的元素.groupBy(f, numPartitions=None, partitionFunc=<function portable_hash at 0x7f51f1ac0668>)
:返回一个分组的RDD
示例:
xxxxxxxxxx
rdd = sc.parallelize([1, 1, 2, 3, 5, 8]) result = rdd.groupBy(lambda x: x % 2).collect() #结果为: [(0, [2, 8]), (1, [1, 1, 3, 5])]
针对两个
RDD
的转换操作:尽管
RDD
不是集合,但是它也支持数学上的集合操作。注意:这些操作都要求被操作的RDD
是相同数据类型的。.union(other)
:合并两个RDD
中所有元素,生成一个新的RDD
。other
:另一个RDD
该操作并不会检查两个输入
RDD
的重复元素,只是简单的将二者合并(并不会去重)。.intersection(other)
:取两个RDD
元素的交集,生成一个新的RDD
。该操作会保证结果是去重的,因此它的性能很差。因为它需要通过网络混洗数据来发现重复的元素。
.subtract(other, numPartitions=None)
:存在于第一个RDD
而不存在于第二个RDD
中的所有元素组成的新的RDD
。该操作也会保证结果是去重的,因此它的性能很差。因为它需要通过网络混洗数据来发现重复的元素。
.cartesian(other)
:两个RDD
的笛卡尔积,生成一个新的RDD
。新
RDD
中的元素是元组(a,b)
,其中a
来自于第一个RDD
,b
来自于第二个RDD
- 注意:求大规模的
RDD
的笛卡尔积开销巨大 - 该操作不会保证结果是去重的,它并不需要网络混洗数据。
- 注意:求大规模的
.keyBy(f)
:创建一个RDD
,它的元素是元组(f(x),x)
。示例:
xxxxxxxxxx
sc.parallelize(range(2,5)).keyBy(lambda x: x*x) # 结果为:[(4, 2), (9, 3), (16, 4)].pipe(command, env=None, checkCode=False)
:返回一个RDD
,它由外部进程的输出结果组成。参数:
command
:外部进程命令env
:环境变量checkCode
:如果为True
,则校验进程的返回值
.randomSplit(weights, seed=None)
:返回一组新的RDD
,它是旧RDD
的随机拆分参数:
weights
:一个double
的列表。它给出了每个结果DataFrame
的相对大小。如果列表的数值之和不等于 1.0,则它将被归一化为 1.0seed
:随机数种子
.zip(other)
:返回一个Pair RDD
,其中键来自于self
,值来自于other
- 它假设两个
RDD
拥有同样数量的分区,且每个分区拥有同样数量的元素
- 它假设两个
.zipWithIndex()
:返回一个Pair RDD
,其中键来自于self
,值就是键的索引。.zipWithUniqueId()
:返回一个Pair RDD
,其中键来自于self
,值是一个独一无二的id
。它不会触发一个
spark job
,这是它与zipWithIndex
的重要区别。
3.2 Pair RDD转换操作
Pair RDD
可以使用所有标准RDD
上的可用的转换操作- 由于
Pair RDD
的元素是二元元组,因此传入的函数应当操作二元元组,而不是独立的元素。
- 由于
基本转换操作:
.keys()
:返回一个新的RDD
,包含了旧RDD
每个元素的键.values()
:返回一个新的RDD
,包含了旧RDD
每个元素的值.mapValues(f)
:返回一个新的RDD
,元素为[K,f(V)]
(保留原来的键不变,通过f
改变值)。.flatMapValues(f)
:返回一个新的RDD
,元素为[K,f(V)]
(保留原来的键不变,通过f
改变值)。它与.mapValues(f)
区别见下面的示例:xxxxxxxxxx
x=sc.parallelize([("a", ["x", "y", "z"]), ("b", ["p", "r"])]) x1=x.flatMapValues(lambda t:t).collect() # x1: [('a', 'x'), ('a', 'y'), ('a', 'z'), ('b', 'p'), ('b', 'r')] x2=x.mapValues(lambda t:t).collect() # x2: [("a", ["x", "y", "z"]), ("b", ["p", "r"])].sortByKey(ascending=True, numPartitions=None, keyfunc=<function <lambda> at 0x7f51f1ab5050>)
:对当前Pair RDD
进行排序,排序结果组成新的RDD
keyfunc
:自定义的比较函数ascending
:如果为True
,则升序排列
.sampleByKey(withReplacement, fractions, seed=None)
:基于键的采样(即:分层采样)参数:
withReplacement
:如果为True
,则是有放回的采样;否则是无放回的采样fractions
:一个字典,指定了键上的每个取值的采样比例(不同取值之间的采样比例无关,不需要加起来为1)seed
:随机数种子
.subtractByKey(other, numPartitions=None)
:基于键的差集。返回一个新的RDD
,其中每个(key,value)
都位于self
中,且不在other
中
基于键的聚合操作:
在常规
RDD
上,fold()、aggregate()、reduce()
等都是行动操作。在Pair RDD
上,有类似的一组操作,用于针对相同键的元素进行聚合。这些操作返回RDD
,因此是转化操作而不是行动操作。返回的新
RDD
的键为原来的键,值为针对键的元素聚合的结果。.reduceByKey(f,numPartitions=None,partitionFunc=<function portable_hash at 0x7f51f1ac0668>)
:合并具有相同键的元素。f
作用于同一个键的那些元素的值。- 它为每个键进行并行的规约操作,每个规约操作将键相同的值合并起来
- 因为数据集中可能有大量的键,因此该操作返回的是一个新的
RDD
:由键,以及对应的规约结果组成
.foldByKey(zeroValue,f,numPartitions=None,partitionFunc=<function portable_hash at 0x7f51f1ac0668>)
:通过f
聚合具有相同键的元素。其中zeroValue
为零值。参见.fold()
.aggregateByKey(zeroValue,seqFunc,combFunc,numPartitions=None,partitionFunc=<function portable_hash at 0x7f51f1ac0668>)
:通过f
聚合具有相同键的元素。其中zeroValue
为零值。参见.aggregate()
.combineByKey(createCombiner,mergeValue,mergeCombiners, numPartitions=None,partitionFunc=<function portable_hash at 0x7f51f1ac0668>)
:它是最为常用的基于键的聚合函数,大多数基于键的聚合函数都是用它实现的。和
aggregate()
一样,combineByKey()
可以让用户返回与输入数据类型不同的返回值。你需要提供三个函数:
createCombiner(v)
:v
表示键对应的值。返回一个C
类型的值(表示累加器)mergeValue(c,v)
:c
表示当前累加器,v
表示键对应的值。返回一个C
类型的值(表示更新后的累加器)mergeCombiners(c1,c2)
:c1
表示某个分区某个键的累加器,c2
表示同一个键另一个分区的累加器。返回一个C
类型的值(表示合并后的累加器)
其工作流程是:遍历分区中的所有元素。考察该元素的键:
如果键从未在该分区中出现过,表明这是分区中的一个新的键。则使用
createCombiner()
函数来创建该键对应的累加器的初始值。注意:这一过程发生在每个分区中,第一次出现各个键的时候发生。而不仅仅是整个
RDD
中第一次出现一个键时发生。如果键已经在该分区中出现过,则使用
mergeValue()
函数将该键的累加器对应的当前值与这个新的值合并由于每个分区是独立处理的,因此同一个键可以有多个累加器。如果有两个或者更多的分区都有同一个键的累加器,则使用
mergeCombiners()
函数将各个分区的结果合并。
数据分组:
.groupByKey(numPartitions=None, partitionFunc=<function portable_hash at 0x7f51f1ac0668>)
:根据键来进行分组。- 返回一个新的
RDD
,类型为[K,Iterable[V]]
,其中K
为原来RDD
的键的类型,V
为原来RDD
的值的类型。 - 如果你分组的目的是为了聚合,那么直接使用
reduceByKey、aggregateByKey
性能更好。
- 返回一个新的
.cogroup(other,numPartitions=None)
:它基于self
和other
两个TDD
中的所有的键来进行分组,它提供了为多个RDD
进行数据分组的方法。- 返回一个新的
RDD
,类型为[K,(Iterable[V],Iterable[W])]
。其中K
为两个输入RDD
的键的类型,V
为原来self
的值的类型,W
为other
的值的类型。 - 如果某个键只存在于一个输入
RDD
中,另一个输入RDD
中不存在,则对应的迭代器为空。 - 它是
groupWith
的别名,但是groupWith
支持更多的TDD
来分组。
- 返回一个新的
数据连接:
数据连接操作的输出
RDD
会包含来自两个输入RDD
的每一组相对应的记录。输出RDD
的类型为[K,(V,W)]
,其中K
为两个输入RDD
的键的类型,V
为原来self
的值的类型,W
为other
的值的类型。.join(other,numPartitions=None)
:返回一个新的RDD
,它是两个输入RDD
的内连接。.leftOuterJoin(other,numPartitions=None)
:返回一个新的RDD
,它是两个输入RDD
的左外连接。.rightOuterJoin(other,numPartitions=None)
:返回一个新的RDD
,它是两个输入RDD
的右外连接。.fullOuterJoin(other, numPartitions=None)
:执行right outer join
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论