# 每日反馈

### 推荐系统基础(8天)

day 01

- 简述推荐系统的算法架构和常用推荐算法

  参考答案: 召回阶段: 从海量item中选取几百~一千物品

  ​				排序阶段: 根据用户的特征以及物品的特征针对海选结果进行排序

  ​                规则过滤: 根据自定义的规则(如反复推荐几次没有点击,则不再展示),和运营策略等方面对排序结果进       

  ​                                 行过滤

  ​               常用推荐算法: 协同过滤推荐(基于内容协同过滤 基于物品协同过滤) 基于内容推荐

- 使用item-BasedCF 实现电影评分预测

  参看讲义

day02

- 简述LFM的原理和如何使用LFM进行评分预测

  参考答案:

  ​	LFM(latent factor model)隐语义模型核心思想是通过隐含特征联系用户和物品, 利用矩阵分解技术，将原始User-Item的评分矩阵（稠密/稀疏）分解为P(User-LF矩阵，即用户和隐含特征矩阵) 和Q矩阵(LF-Item矩阵，即隐含特征和物品的矩阵)，然后利用P∗Q还原出User-Item评分矩阵R。整个过程相当于降维处理

  利用LFM进行评分预测:

  预测用户1对物品1的评分   $$P_{1,k} . Q_{k,1}$$

- LFM 实现电影评分预测

  参看讲义

day03

- 简述Hdfs的基本架构和hdfs的读写流程

  参考答案

  ​	HDFS架构:

  - 1个NameNode/NN(Master) 带 DataNode/DN(Slaves) (Master-Slave结构)
  - 1个文件会被拆分成多个Block
  - NameNode(NN)
    - 负责客户端请求的响应
    - 负责元数据（文件的名称、副本系数、Block存放的DN）的管理
      - 元数据 MetaData 描述数据的数据
    - 监控DataNode健康状况 10分钟没有收到DataNode报告认为Datanode死掉了
  - DataNode(DN)
    - 存储用户的文件对应的数据块(Block)
    - 要定期向NN发送心跳信息，汇报本身及其所有的block信息，健康状况

  读写流程:

  ​	读流程:

  ​	写流程:

- 通过MRJob 实现统计一篇文章的单词数量 字符数量 行数

  ```python
  from mrjob.job import MRJob
  
  class MRWordCount(MRJob):
  
      def mapper(self, _, line):
          yield "chars", len(line)
          yield "words", len(line.split())
          yield "lines", 1
  
      def reducer(self, word, counts):
          yield word, sum(counts)
  
  if __name__ == '__main__':
      MRWordCount.run()
  ```

  

day04

- 简述Hive的原理和数据模型

  **参考答案**

  Hive原理: 将 SQL 语句转换为 MapReduce 任务运行，使不熟悉 MapReduce 的用户很方便地利用 HQL 处理和计算 HDFS 上的结构化的数据,是一款基于 HDFS 的 MapReduce **计算框架**

  Hive的数据模型:

  - Hive 中所有的数据都存储在 HDFS 中，没有专门的数据存储格式
  - 在创建表时指定数据中的分隔符，Hive 就可以映射成功，解析数据。
  - Hive 中包含以下数据模型：
    - db：在 hdfs 中表现为 hive.metastore.warehouse.dir 目录下一个文件夹
    - table：在 hdfs 中表现所属 db 目录下一个文件夹
    - external table：数据存放位置可以在 HDFS 任意指定路径
    - partition：在 hdfs 中表现为 table 目录下的子目录
    - bucket：在 hdfs 中表现为同一个表目录下根据 hash 散列之后的多个文件

- hive实现wordcount

  ```SQL
  select word, count(*) from (select explode(split(sentence, ' ')) as word from 表名） t group by word;
  ```


day05 HBase

- 简述列存储的特点，与行存储的区别，以及HBase的数据模型

  **参考答案**

  列式存储特点: 一列保存到同一个文件中,不同列之间在磁盘上不连续,查询时只有涉及到的列会被读取,查询效率较高,方便稀疏数据的保存

  与行存储的区别: 一行一行存储,所有数据保存在一起,占据连续的磁盘空间,查询时没有涉及到的列也会被读取,稀疏数据存储浪费空间

- 通过happybase 创建Hbase表 插入数据 查询数据（scan查询和get查询） 删除数据

  参考讲义

day06

- 简答题 什么是RDD，有哪些特点，RDD的算子分几类，各自特点

  **参考答案**

  RDD概念 分布式弹性数据集

  RDD特点: 不可变,弹性,可分区,可以并行计算

  RDD算子 transformation 不会立即执行 

  ​                action 会立即执行

  ​                 persist 将一个RDD进行缓存

- 编程题 通过RDD实现统计一篇文章的 单词数量 行数

  ```python
  from pyspark import SparkContext
  spark = SparkSession.builder.appName("xxx").getOrCreate()
  sc = spark.sparkContext()
  
  rdd1 = sc.textFile("file:///root/bigdata/data/access.log")
  #统计文章行数 把每一行数据记为("line",1)
  rdd2 = rdd1.map(lambda x:("line",1)).reduceByKey(lambda a,b:a+b)
  print(rdd2.collect())
  #统计单词数量
  rdd3 = rdd1.map(lambda x:("words",len(x.split()))).reduceByKey(lambda a,b:a+b)
  print(rdd3.collect())
  sc.stop()
  ```

  

day07

- 简答题 SparkSQL基本原理 DataFrame特点

  **参考答案**

  基本原理

  - 它是spark中用于处理结构化数据的一个模块

  - 可以看做是带有Schema的RDD,数据的处理还是利用RDD的算子操作

  - Spark SQL 生成的RDD相关代码,经过了优化,效率更高

    

  DataFrame特点

  - DataFrame是一个分布式的**行集合**，可以想象为一个关系型数据库的表
  - DataFrame的处理也会转换为RDD的操作,所以具有跟RDD类似的特点
    - 不可改变
    - 数据的处理分成transformation(延迟执行)和action
    - 分布式

- 编程题 SparkSQL 处理鸢尾花数据集案例

  参考讲义

day08

- 简答题 简述电商推荐案例中整个推荐结果产生流程

  **参考答案**

  用户行为数据=>利用spark ALS模块训练协同过滤 LFM模型=>找回感兴趣的商品类别

  用户点击广告记录+用户的特征+广告特征=>Spark ML 训练逻辑回归模型

  通过商品类别找到类别对应的商品=>逻辑回归模型预估每一件商品的点击率=>根据点击率的高低排序产生推荐结果

- 使用spark 的 ALS模块 利用第一天的movie lens数据 进行电影推荐 （召回）

  ```python
  from pyspark.sql.types import StructType, StructField, FloatType, IntegerType, LongType
  # 构建结构对象
  schema = StructType([
      StructField("userId", IntegerType()),
      StructField("movieId", IntegerType()),
      StructField("rating", FloatType()),
      StructField("timeStamp", LongType()),
  ])
  from pyspark.sql import SparkSession
  #创建SparkSession
  spark =  SparkSession.builder.appName('test').getOrCreate()
  #读取csv文件 指定schema
  movie_rating = spark.read.csv('ml-latest-small/ratings.csv',schema=schema,header=True)
  from pyspark.ml.recommendation import ALS
  #利用ALS训练 指定用户列 物品列 和评分列
  als = ALS(userCol='userId', itemCol='movieId', ratingCol='rating', checkpointInterval=2)
  model = als.fit(movie_rating)
  #训练之后为所有用户推荐3个电影
  model.recommendForAllUsers(3).show(truncate = False)
  ```


select * from (select Channel,sum(Installs) as b from 表名 group by Channel) where b>300000

select d.* from 表名 as d,(select * from (select Dates,Channel,collect_list(Installs) as r from (select * from 表名 where Installs>=70000) a group by Dates,Channel) b where size(r)>1) e where d.Dates=e.Dates and d.Channel=e.Channel