我的架构如下所示:
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)
令我震惊的是,我正在获得重复项,如下面的快照所示。我期望每个演员出现一次,具有明显的计数:
打印以下结果:
[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]
答案 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)