从DataFrame收集两个值,并将它们用作案例类的参数;寻找不太详细的解决方案

时间:2019-03-09 13:18:38

标签: scala apache-spark

我有一些火花result: DataFrame = ...中的数据,其中有两个整数列值得关注; weekyear。这些列的值对于所有行都是相同的。

我想提取这两个整数值,并将它们作为参数传递以创建WeekYear

case class WeekYear(week: Int, year: Int)

下面是我当前的解决方案,但我认为必须有一种更优雅的方法来做到这一点。没有创建temp的中间步骤怎么办?

val temp = result
  .select("week", "year")
  .first
  .toSeq
  .map(_.toString.toInt)

val resultWeekYear = WeekYear(temp(0), temp(1))

1 个答案:

答案 0 :(得分:2)

对数据帧使用case class的最佳方法是允许spark使用.as()方法将其转换为数据集。只要您的case类具有与所有列名都匹配的属性,它就应该很容易工作。

case class WeekYear(week: Int, year: Int)
val df = spark.createDataset(Seq((1, 1), (2, 2), (3, 3))).toDF("week", "year")
val ds = df.as[WeekYear]
ds.show()

其中提供了一个Dataset[WeekYear],如下所示:

+----+----+
|week|year|
+----+----+
|   1|   1|
|   2|   2|
|   3|   3|
+----+----+

您可以利用一些更复杂的嵌套类,但是您必须为此开始使用Encoders,以便spark知道如何来回转换。

Spark进行了一些隐式转换,因此ds可能仍然看起来像Dataframe,但实际上是一个强类型的Dataset[WeekYear],而不是{ {1}}具有任意列。您可以像Dataset[Row]一样对其进行操作。然后,只需抓住其中的RDD,您便已经拥有所需的类型。

.first()