全国职业院校技能大赛-大数据应用赛项-特征工程

剔除订单信息表与订单详细信息表中用户id与商品id不存在现有的维表中的记录,同时建议多利用缓存并充分考虑并行度来优化代码,达到更快的计算效果。

1、根据Hive的dwd库中相关表或MySQL中shtd_store中相关表(order_detail、sku_info),计算出与用户id为6708的用户所购买相同商品种类最多的前10位用户(只考虑他俩购买过多少种相同的商品,不考虑相同的商品买了多少次),将10位用户id进行输出,若与多个用户购买的商品种类相同,则输出结果按照用户id升序排序,输出格式如下,将结果截图粘贴至客户端桌面【Release\任务C提交结果.docx】中对应的任务序号下;

结果格式如下:

-------------------相同种类前10的id结果展示为:--------------------

1,2,901,4,5,21,32,91,14,52

该题目要求计算6708用户所购买的全部商品,并找到与6708用户购买相同商品最多的前10位用户,注意不需要考虑购买了商品多少次,购买10次也算购买一次计算

根据题意我们首先需要计算每个用户购买的商品,但是根据题目提示的相关表竟然没有user_id!所以猜测sku_info应该是order_info

首先我们需要搭建程序骨架

object Test3 {
   
  def main(args: Array[String]): Unit = {
   
    val spark: SparkSession = SessionUtils.getSession
    import spark.implicits._
    SessionUtils.close(spark)
  }
}

读取mysql中的数据

val order_detail: DataFrame = MysqlUtils.read(spark, "ds_pub", "order_detail")
val order_info: DataFrame = MysqlUtils.read(spark, "ds_pub", "order_info")

将2个表根据order_id连接起来,查出每个用户购买的商品并去重

val data: Dataset[Row] = order_detail.join(order_info, order_detail("order_id") === order_info("id"))
  .select("user_id", "sku_id")
  .distinct()

过滤出6708用户所购买的商品

val user6708_skuids: Array[Int] = data.filter(col("user_id") === 6708).select("sku_id").map((_: Row) (0).toString.toInt).collect()

添加一列,该列表示当前用户购买的物品是不是属于6708所购买的

val user_ids: String = data.withColumn("cos", when(col("sku_id").isin(user6708_skuids: _*), 1.0).otherwise(0.0))

根据user_id进行聚合算出与6708购买相同商品的数量,但是别忘了,我们也把6708用户计算进去了,所以要剔除

...
.groupBy("user_id")
.agg(sum("cos").as("same"))
.filter(col("user_id") !== 6708)

按照id升序取出相似度最高的10位用户,将dataframe转为array进行输出

...
 .orderBy(desc("same"), asc("user_id")
  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值