我有一个看起来像这样的数据框架:
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中选择值时提供数据类型。
rdd
和 dataframes/datasets
在本质上分布, foreach
和 foreachPartition
在 executor s上执行,在执行者本身上转换 dataframe
或 rdd
而无需返回任何东西。因此,如果要将变量返回到驱动程序节点,则必须使用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
我希望答案有帮助