使用Apache Spark DataFrame或SQL进行不同的计数

时间:2016-09-01 06:36:33

标签: apache-spark apache-spark-sql spark-dataframe

我的架构如下所示:

scala> airing.printSchema()
root
 |-- program: struct (nullable = true)
 |    |-- detail: struct (nullable = true)
 |    |    |-- contributors: array (nullable = true)
 |    |    |    |-- element: struct (containsNull = true)
 |    |    |    |    |-- contributorId: string (nullable = true)
 |    |    |    |    |-- name: string (nullable = true)
 |    |    |    |    |-- order: long (nullable = true)

我需要根据独特的Actors计算,找到最受欢迎的演员。 我的代码如下:

val castCounts = airing.groupBy("program.detail.contributors.name").count().sort(desc("count")).take(10)

令我震惊的是,我正在获得重复项,如下面的快照所示。我期望每个演员出现一次,具有明显的计数: enter image description here

打印以下结果:

[WrappedArray(),4344]
[WrappedArray(Matt Smith),16]
[WrappedArray(Phil Keoghan),15]
[WrappedArray(Don Adams, Barbara Feldon, Edward Platt),10]
[WrappedArray(Edward Platt, Don Adams, Barbara Feldon),10]

1 个答案:

答案 0 :(得分:0)

有两个步骤 使用explode函数使您的数据保持平稳,因此每行数据只有1个贡献者。

  val df = airing.withColumn("contributor", explode(col("program.detail.contributors"))))

从新的df获得结果,贡献者已经爆炸了。

  val castCounts = df.groupBy("contributor.name").count().sort(desc("count")).take(10)