Spark合并DataFrame

已经从hive中读取了两个DataFrame,showRecords为展示记录,playRecords为播放记录;vid为视频标识(还有其他字段,此处无关,省略)
showRecords:

vid
1
1
2
2
3
3
4

playRecords:

vid
1
2
1

问题,如何统计每个vid的展示次数和播放次数,得到类似如下结果(结果count_play降序排列):

vid  count_play  count_show
1    2           2
2    1           2
3    0           2
4    0           1

我尝试了

val mergeRecords = showRecords.groupBy("vid").agg("vid" -> "count").join(playRecords.groupBy("vid").agg("vid" -> "count"), Seq("vid"), "full_outer")

但结果不符合预期,没有按count_play排序,并且由于是full_outer join导致count_play列出现null值。(也尝试了别的方法,但那个vid容易出现问题,因为两个表的主键vid是同名的。)请教如何用比较优雅的方法解决这个问题?

阅读 6.8k
1 个回答
val res = showRecords.groupBy("vid").agg(count("vid").as("showtimes")).join(playRecords.gr‌​oupBy("vid").agg(cou‌​nt("vid").as("playti‌​‌​mes")), Seq("vid"), "left").na.fill(0).orderBy(col("playtimes").desc)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进