如何从数据集中获取值并将其存储在Scala值中



我有一个看起来像这样的数据框架:

scala> avgsessiontime.show()
+-----------------+
|              avg|
+-----------------+
|2.073455735838315|
+-----------------+

我需要将值2.07345735838315存储在变量中。我尝试使用

avgsessiontime.collect 

但这开始给我任务不是序列化的异常。因此,为避免,我开始使用foreachprtition。但是我不知道如何在数组变量中提取值2.073455735838315。

scala> avgsessiontime.foreachPartition(x => x.foreach(println))
[2.073455735838315]

但是当我这样做时:

avgsessiontime.foreachPartition(x => for (name <- x) name.get(0))

我得到空白/空结果。甚至长度返回空。

avgsessiontime.foreachPartition(x => for (name <- x) name.length)

我知道名称是type org.apache.spark.sql.row。然后它应该返回两个结果。

您可能需要:

avgsessiontime.first.getDouble(0)

在这里使用first提取Row对象,而.getDouble(0)Row对象提取值。


val df = Seq(2.0743).toDF("avg")
df.show
+------+
|   avg|
+------+
|2.0743|
+------+
df.first.getDouble(0)
// res6: Double = 2.0743
scala> val df = spark.range(10)
df: org.apache.spark.sql.Dataset[Long] = [id: bigint]
scala> df.show
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
|  4|
|  5|
|  6|
|  7|
|  8|
|  9|
+---+
scala> val variable = df.select("id").as[Long].collect
variable: Array[Long] = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

相同的方式,您可以提取任何类型的值,即双字符串。您只需要在从DF中选择值时提供数据类型。

rdddataframes/datasets在本质上分布, foreachforeachPartition executor s上执行,在执行者本身上转换 dataframerdd而无需返回任何东西。因此,如果要将变量返回到驱动程序节点,则必须使用collect

假设您的dataframe

+-----------------+
|avg              |
+-----------------+
|2.073455735838315|
|2.073455735838316|
+-----------------+

执行以下操作将打印所有值,您也可以将其存储在变量中

avgsessiontime.rdd.collect().foreach(x => println(x(0)))

它将打印

2.073455735838315
2.073455735838316

现在,如果您只想要第一个,那么您可以做

avgsessiontime.rdd.collect()(0)(0)

这会给你

2.073455735838315

我希望答案有帮助

相关内容

  • 没有找到相关文章

最新更新