@[toc]
需求说明
计算某一个指定用户与其他用户购买的共同商品,假设用户 user01
购买了商品 1
、2
、3
,那么需要找出其他购买过商品 1
或 2
或 3
的用户。
需求分析
1.指定用户
- 获取指定用户所购买的商品
2.其他用户
- 判断其他用户所购买的商品是否被指定用户购买
需求实现
获取指定用户 user01
与其他用户购买过的相同商品。
import org.apache.spark.sql.{DataFrame, SparkSession}
object Test{
def main(args: Array[String]): Unit = {
// 创建 SparkSession 对象
val spark: SparkSession = SparkSession
.builder()
.appName("Test")
.master("local[*]")
.enableHiveSupport()
.getOrCreate()
import spark.implicits._
// 创建模拟数据
val df: DataFrame = Seq(
("user01", 1),
("user01", 2),
("user01", 3),
("user02", 1),
("user02", 2),
("user03", 3),
("user04", 1),
("user04", 4),
("user05", 5),
("user05", 6),
("user06", 10)
).toDF("user_id", "product_id")
// 创建临时视图
df.createOrReplaceTempView("purchase_data")
// TODO 1.获取指定用户(user01)所购买的商品
spark.sql(
"""
|select
| collect_set(product_id) total_purchased_product_id
|from
| purchase_data
|where
| user_id = "user01"
|group by
| user_id
|""".stripMargin).createOrReplaceTempView("target_data")
// TODO 2.获取购买过相同商品的用户
spark.sql(
"""
|select
| user_id,
| product_id
|from
| purchase_data,
| target_data
|where
| -- 判断商品是否被 user01 所购买
| user_id <> "user01"
| and
| array_contains(total_purchased_product_id,product_id)
|""".stripMargin).show()
}
}
输出结果如下所示:
+-------+----------+
|user_id|product_id|
+-------+----------+
| user02| 1|
| user02| 2|
| user03| 3|
| user04| 1|
+-------+----------+
解决这个需求的关键是了解 array_contains
函数:
平常碰到其它需求可以在 Spark SQL 官方函数文档 找找有没有相关的处理函数,让需求简单化。
如果你有碰到复杂的指标计算需求无法解决,欢迎各位同学在评论区或者私信与我进行讨论(无偿),学无止境,冲呀!