如何循环Spark数据框

时间:2017-11-13 20:52:33

标签: scala apache-spark apache-spark-sql

如何循环Spark数据框? 我有一个数据框,包括:

time, id, direction
10, 4, True  //here 4 enters --> (4,)
20, 5, True  //here 5 enters --> (4,5)
34, 5, False //here 5 leaves --> (4,)
67, 6, True  //here 6 enters --> (4,6)
78, 6, False //here 6 leaves --> (4,)
99, 4, False //here 4 leaves --> ()

它按时间排序,现在我想逐步完成并积累有效的ID。 ids在方向上输入== True并在方向上退出== False

所以生成的RDD应该如下所示

time, valid_ids
(10, (4,))
(20, (4,5))
(34, (4,))
(67, (4,6))
(78, (4,)
(99, ())

我知道这不会并行化,但是df不是那么大。那怎么能在Spark / Scala中完成呢?

3 个答案:

答案 0 :(得分:4)

如果数据很小(" 但df不是那么大")我只是使用Scala集合进行收集和处理。如果类型如下所示:

<div>Click to Expand</div>

你可以收集:

df.printSchema
root
 |-- time: integer (nullable = false)
 |-- id: integer (nullable = false)
 |-- direction: boolean (nullable = false)

val data = df.as[(Int, Int, Boolean)].collect.toSeq

scanLeft

答案 1 :(得分:1)

不建议 scala 开发人员使用var,但我仍然使用var

发布回答
var collectArray = Array.empty[Int]
df.rdd.collect().map(row => {
  if(row(2).toString.equalsIgnoreCase("true")) collectArray = collectArray :+ row(1).asInstanceOf[Int]
  else collectArray = collectArray.drop(1)
  (row(0), collectArray.toList)
})

这应该给你结果

(10,List(4))
(20,List(4, 5))
(34,List(5))
(67,List(5, 6))
(78,List(6))
(99,List())

答案 2 :(得分:0)

假设相应数据框的名称为someDF,然后执行:

val df1 = someDF.rdd.collect.iterator;
   while(df1.hasNext) 
   {
       println(df1.next);
   }