我有一个带有以下架构的火花数据框:
root
|-- cluster_info: struct (nullable = true)
| |-- cluster_id: string (nullable = true)
| |-- influencers: array (nullable = true)
| | |-- element: struct (containsNull = true)
| | | |-- screenName: string (nullable = true)
我需要获得screenName的唯一列表,我正在使用下面的代码。但是收集是一项非常繁重的操作,是否有更好的方法。
var namesDF = df.select(concat_ws(",", $"cluster_info.influencers.screenName").as("screenName"))
val influencerNameList: List[String] = namesDF.map(r => r(0).asInstanceOf[String]).collect().toList.mkString(",").split(",").toList.distinct
请建议。提前谢谢。
答案 0 :(得分:2)
您可以选择嵌套字段screenName
作为array
和explode
,然后获取distinct
值,如下所示
var namesDF = df.select($"cluster_info.influencers.screenName").as("screenName"))
.withColumn("screenName", explode($"screenName"))
.select("screenName.screenName")
.distinct()
您已获得distinct
screenName
要获取列表,您可以使用
namesDF.rdd.map(_.getString(0).collect()
但如果你有大数据集,我建议你不要收集结果
希望这有帮助!