摘要: 在众多召回策略里面,基于Item与基于User(可参考:https://www.cnblogs.com/SysoCjs/p/11466424.html)在实现上非常相似。所以这里使用了跟基于User协同过滤的数据u.data。 实现原理: 区别于User,先根据User已经购买过,或者评价过的Ite 阅读全文
posted @ 2019-09-05 16:16 KamShing 阅读(2232) 评论(0) 推荐(0) 编辑
摘要: 在Spark1.2之后,Spark自带实现TF-IDF接口,只要直接调用就可以,但实际上,Spark自带的词典大小设置较于古板,如果设置小了,则导致无法计算,如果设置大了,Driver端回收数据的时候,容易发生OOM,所以更多时候都是自己根据实际情况手动实现TF-IDF。不过,在本篇文章中,两种方式 阅读全文
posted @ 2019-09-05 16:10 KamShing 阅读(2525) 评论(0) 推荐(0) 编辑
摘要: 项目地址:https://github.com/ChanKamShing/UserCF_Spark.git 推荐系统的作业流程: 召回/match(推荐引擎)-> 物品候选集 -> 过滤 -> 排序 -> 策略(保证结果多样性) -> 推荐list 协同过滤CF属于第一阶段,我们常常称之为“推荐引擎 阅读全文
posted @ 2019-09-05 15:45 KamShing 阅读(691) 评论(6) 推荐(0) 编辑
摘要: 项目地址:https://github.com/ChanKamShing/UserCF_python.git 推荐系统的作业流程: 召回/match(推荐引擎)-> 物品候选集 -> 过滤 -> 排序 -> 策略(保证结果多样性) -> 推荐list 协同过滤CF属于第一阶段,我们常常称之为“推荐引 阅读全文
posted @ 2019-09-05 15:35 KamShing 阅读(913) 评论(0) 推荐(0) 编辑
摘要: Spark数据的写入过程的入口点位doPutIterator方法。下面是一些方法的调用关系图: 在该方法中,根据数据是否缓存到内存中处理。如果不缓存到内存中,则调用BlockManager的putIterator方法直接存储到磁盘中;如果缓存到内存中,则先判断数据存储级别是否对数据进行了反序列化操作 阅读全文
posted @ 2019-09-05 15:25 KamShing 阅读(1491) 评论(0) 推荐(0) 编辑
摘要: 实际生产中,由于各种原因,导致事件创建时间与处理时间不一致,收集的规定对实时推荐有较大的影响。所以一般情况时选取创建时间,然后事先创建flink的时间窗口。但是问题来了,如何保证这个窗口的时间内所有事件都到齐了?这个时候就可以设置水位线(waterMark)。 概念:支持基于时间窗口操作,由于事件的 阅读全文
posted @ 2019-09-05 15:22 KamShing 阅读(2356) 评论(0) 推荐(0) 编辑
摘要: Spark作业执行中,有一个步骤是给任务进行资源分配,实际上这些任务由一些任务管理器TaskSetManager负责管理,资源分配过程中,会先根据某种排序算法排好序,然后根据就近原则给任务进行资源分配。那么关于TaskSetManager的排序是根据哪个算法呢?现在就来介绍。 排序算法由两种调度策略 阅读全文
posted @ 2019-09-05 15:19 KamShing 阅读(622) 评论(0) 推荐(0) 编辑
摘要: 从表Schema处理角度对比Hive和Parquet,两者主要的区别: Hive区分大小写,Parquet不区分大小写;Hive允许所有的列为空,而Parquet不允许所有列为空;基于上述两点区别,在进行Hive metastore Parquet转换为SpqrkSql Parquet时,需要将两者 阅读全文
posted @ 2019-09-05 15:17 KamShing 阅读(1138) 评论(0) 推荐(0) 编辑
摘要: 自定义强类型聚合函数跟自定义无类型聚合函数的操作类似,相对的,实现自定义强类型聚合函数则要继承org.apache.spark.sql.expressions.Aggregator。强类型的优点在于:其内部与特定数据集紧密结合,增强了紧密型、安全性,但由于其紧凑的特性,降低了适用性。 准备emplo 阅读全文
posted @ 2019-09-05 15:14 KamShing 阅读(518) 评论(0) 推荐(0) 编辑
摘要: 准备数据: 一、定义自定义无类型聚合函数 想要自定义无类型聚合函数,那必须得继承org.spark.sql.expressions.UserDefinedAggregateFunction,然后重写父类得抽象变量和成员方法。 二、使用自定义无类型聚合函数 输出结果: 阅读全文
posted @ 2019-09-05 15:09 KamShing 阅读(272) 评论(0) 推荐(0) 编辑
摘要: 随着Spark1.4.x的更新,Spark提供更高阶的对象DataFrame,提供了比RDD更丰富的API操作,同时也支持RDD转DataFrame(下面简称“DF”),但是要注意,不是任意类型对象组成的RDD都可以转换成DF,,只有当组成RDD[T]的每一个T对象内部具有鲜明的字段结构时,才能隐式 阅读全文
posted @ 2019-09-05 15:05 KamShing 阅读(5980) 评论(0) 推荐(0) 编辑
摘要: 对于Executor的计算结果,会根据结果的大小使用不同的处理策略: 任务执行完成之后,TaskRunner将任务的执行结果发送给DriverEndpoint,DriverEndpoint接收到信息后,交给TaskSchedulerImpl的statusUpdate方法进行处理,该方法根据不同的任务 阅读全文
posted @ 2019-09-05 15:01 KamShing 阅读(617) 评论(0) 推荐(0) 编辑