【问题标题】:How do I create an Encoder of type List[Row] for creating a Dataset[ List[Row] ] in spark?如何创建 List[Row] 类型的编码器以在 Spark 中创建 Dataset[ List[Row] ]?
【发布时间】:2018-05-24 11:20:20
【问题描述】:

基本上,我在 spark 数据帧上执行“groupbyKey”,然后执行“mapGroups”转换。 “mapGroups”将生成 Dataset[U],它需要一个“U”类型的编码器。我将每组值转换为 List[Row] 类型,因为我必须传递一个编码器。我可以通过其架构创建“行”类型的编码器,但不知道如何为“列表[行]”数据类型创建编码器。

import sqlContext.implicits._
import org.apache.spark.sql._
import org.apache.spark.sql.catalyst.encoders._
val groupedDataset = df.repartition($"_id")
                        .groupByKey(row => row.getAs[Long]("_id"))
                        .mapGroups((key,value) => value.toList)( ??? Here Encoder of List[Row] is Required ???)`

【问题讨论】:

  • 这是哪个库?它是特定于 Spark 的编码器,还是我们在谈论通用的东西,例如 JSON 编码?
  • 是的,和spark dataset的编码器有关。我添加了一个代码sn-p。
  • 你是想模仿 groupBy + agg(collect_list) 还是我错过了什么?
  • 我的用例如下:我有一个数据框,我想组合按键分组的行集并将其存储到任何类型的集合中(可以是列表、数组甚至数据框之类的任何东西或数据集)。

标签: scala apache-spark


【解决方案1】:

您可以将 Seq 与 import spark.implicits._ 一起使用 但是如果这是你可以使用的用例,你不需要实现它

df.groupBy("_id").agg(collect_list("the column you want to collect of values"))

【讨论】:

  • 我的用例如下:我有一个数据框,我想组合按键分组的行集并将其存储到任何类型的集合中(可以是列表、数组甚至数据框之类的任何东西或数据集)。我怎样才能做到这一点?
  • 你试过我写的伪代码吗?
  • 是的,没错。但是如果我必须收集 agg 中的所有列怎么办?我应该手动将所有列名写为 collect_list 还是有更好的方法?
  • 好吧,我终于明白了。我将所有其他列(_id 除外)合并为单个列,最后在其上应用 .agg(collect_list())。感谢您的帮助。
猜你喜欢
  • 2018-10-02
  • 1970-01-01
  • 2020-05-20
  • 2020-08-14
  • 2019-08-07
  • 2022-11-07
  • 2016-09-23
  • 2020-06-24
  • 2020-05-23
相关资源
最近更新 更多