【问题标题】:Apache Spark group by combining types and sub typesApache Spark 组合类型和子类型
【发布时间】:2018-05-03 02:40:52
【问题描述】:

我在 spark 中有这个数据集,

val sales = Seq(
  ("Warsaw", 2016, "facebook","share",100),
  ("Warsaw", 2017, "facebook","like",200),
  ("Boston", 2015,"twitter","share",50),
  ("Boston", 2016,"facebook","share",150),
  ("Toronto", 2017,"twitter","like",50)
).toDF("city", "year","media","action","amount")

我现在可以像这样按城市和媒体对它进行分组,

val groupByCityAndYear = sales
  .groupBy("city", "media") 
  .count()
groupByCityAndYear.show()

+-------+--------+-----+
|   city|   media|count|
+-------+--------+-----+
| Boston|facebook|    1|
| Boston| twitter|    1|
|Toronto| twitter|    1|
| Warsaw|facebook|    2|
+-------+--------+-----+

但是,我怎样才能将媒体和动作组合在一列中,所以预期的输出应该是,

+-------+--------+-----+
| Boston|facebook|    1|
| Boston| share  |    2|
| Boston| twitter|    1|
|Toronto| twitter|    1|
|Toronto| like   |    1|
| Warsaw|facebook|    2|
| Warsaw|share   |    1|
| Warsaw|like    |    1|
+-------+--------+-----+

【问题讨论】:

  • 是 pyspark 还是 scala?
  • 我对任何解决方案都很满意。两者都很好。甚至 spark-sql 也可以。

标签: scala apache-spark pyspark apache-spark-sql pyspark-sql


【解决方案1】:

将media 和action 列合并为array 列,explode 它,然后执行groupBy count:

sales.select(
    $"city", explode(array($"media", $"action")).as("mediaAction")
).groupBy("city", "mediaAction").count().show()

+-------+-----------+-----+
|   city|mediaAction|count|
+-------+-----------+-----+
| Boston|      share|    2|
| Boston|   facebook|    1|
| Warsaw|      share|    1|
| Boston|    twitter|    1|
| Warsaw|       like|    1|
|Toronto|    twitter|    1|
|Toronto|       like|    1|
| Warsaw|   facebook|    2|
+-------+-----------+-----+

或者假设media 和action 不相交(这两列没有共同的元素):

sales.groupBy("city", "media").count().union(
    sales.groupBy("city", "action").count()
).show
+-------+--------+-----+
|   city|   media|count|
+-------+--------+-----+
| Boston|facebook|    1|
| Boston| twitter|    1|
|Toronto| twitter|    1|
| Warsaw|facebook|    2|
| Boston|   share|    2|
| Warsaw|   share|    1|
| Warsaw|    like|    1|
|Toronto|    like|    1|
+-------+--------+-----+

【讨论】:

  • 谢谢。这只是一个示例数据集。该解决方案将如何处理 60 亿条记录。 ?我对使用爆炸持怀疑态度。
  • 假设媒体和行动不相交: -- 你能解释一下吗?再次感谢。
  • 我不确定explode是否效率很低,但你可以做两个分组然后合并结果。
  • 不相交 我的意思是没有共同的元素。
  • 我从来没有写过任何UDF。无论如何谢谢。我想,我应该把它作为一个新问题来问。
猜你喜欢
  • 2016-08-08
  • 2018-05-21
  • 1970-01-01
  • 2019-11-14
  • 2015-06-04
  • 2021-06-06
  • 2019-09-22
  • 2015-06-04
  • 2021-12-03
相关资源
最近更新 更多