【问题标题】:Spark dataframe to a listSpark数据框到列表
【发布时间】:2019-01-14 00:36:25
【问题描述】:

我有一个具有以下架构的 spark 数据框:

root
 |-- cluster_info: struct (nullable = true)
 |    |-- cluster_id: string (nullable = true)
 |    |-- influencers: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- screenName: string (nullable = true)

我需要获取唯一的 screenName 列表,我正在使用下面的代码进行操作。但是collect是一个很繁重的操作,有没有更好的方法呢。

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

请提出建议。提前致谢。

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案1】:

    您可以选择嵌套字段screenNamearrayexplode 它并获取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()
    

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

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回复。但是当我对其应用地图功能时,它会给出错误:无法找到存储在数据集中的类型的编码器。通过导入 spark.implicits 支持原始类型(Int、String 等)和产品类型(案例类)。未来版本中将添加对序列化其他类型的支持。 namesDF.map(fluencerName => { 错误:方法映射的参数不足
    • 还是一样。可能是我在地图上做错了什么。
    • 我尽量避免收集。
    • 收集失败:org.apache.spark.SparkException:作业因阶段失败而中止:阶段 2.0 中的任务 0 失败 1 次,最近一次失败:阶段 2.0 中丢失任务 0.0(TID 2, localhost,执行程序驱动程序):com.microsoft.sqlserver.jdbc.SQLServerException:连接重置
    猜你喜欢
    • 2018-03-26
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2020-09-13
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多