如何从数据集中获取值并将其存储在Scala值中?
问题描述:
我有一个数据帧,看起来像这样:如何从数据集中获取值并将其存储在Scala值中?
scala> avgsessiontime.show()
+-----------------+
| avg|
+-----------------+
|2.073455735838315|
+-----------------+
我需要的价值2.073455735838315存储在一个变量。我试着用
avgsessiontime.collect
而是开始给我任务不能序列异常。所以为了避免我开始使用foreachPitition。但我不知道如何提取数组变量中的值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)
我知道name的类型为org.apache.spark.sql.Row,那么它应该返回这两个结果。
答
您可能需要:
avgsessiontime.first.getDouble(0)
这里使用first
提取对象,.getDouble(0)
从对象中提取价值。
val df = Seq(2.0743).toDF("avg")
df.show
+------+
| avg|
+------+
|2.0743|
+------+
df.first.getDouble(0)
// res6: Double = 2.0743
答
rdd
和dataframes/datasets
分布于自然界,并foreach
和foreachPartition
是在执行人小号执行,对转型本身执行人或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
我希望答案是有帮助的
答
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中选择值时输入数据类型。
_“但开始给我任务不可序列化的异常。”_