Spark数据帧到列表

时间:2018-03-23 14:25:04

标签: apache-spark apache-spark-sql

我有一个带有以下架构的火花数据框:

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

请建议。提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以选择嵌套字段screenName作为arrayexplode,然后获取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()

但如果你有大数据集,我建议你不要收集结果

希望这有帮助!