2017-09-27 106 views
0

我有一个数据帧,看起来像这样:如何从数据集中获取值并将其存储在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,那么它应该返回这两个结果。

+0

_“但开始给我任务不可序列化的异常。”_ < - 解决真正的问题不会引入新的(!)你可以粘贴异常+代码?什么是Spark版本? –

回答

2

您可能需要:

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 
+0

谢谢。刚刚尝试过。我得到了“org.apache.spark.SparkException:任务不可序列化”。我想先(),采取(),收集()所有工作以相同的方式。此外,我正在运行这是火花外壳。 – cryp

+0

这对我有用。您可以尝试重新启动您的spark-shell,或者确保您没有打开多个spark shell。 – Psidom

+1

我单独运行我的代码(不是作为应用程序)以及您的建议工作。事实上,即使collect()工作。但作为应用程序它没有。我只是添加了对象匹配扩展了Serializable,它工作得很好!添加“扩展可序列化”是我猜的关键。 – cryp

0

rdddataframes/datasets分布于自然界,并foreachforeachPartition是在执行人小号执行,对转型本身执行人或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 

我希望答案是有帮助的

0
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中选择值时输入数据类型。

相关问题