我有一些火花result: DataFrame = ...
中的数据,其中有两个整数列值得关注; week
和year
。这些列的值对于所有行都是相同的。
我想提取这两个整数值,并将它们作为参数传递以创建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))
答案 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()