获取火花过滤器处理了多少行

时间:2018-10-31 20:55:35

标签: scala apache-spark

我有一个基本操作-过滤数据帧/ rdd。

val sc = ...
val seqRDD = sc.parallelize(1 to 10)

val filteredData = seqRDD.filter(v => v < 10)
... count / other actions...

我想获取有关此过滤器中已经处理了多少行的实时统计信息。或者,完成了多少百分比的过滤器。
如何获得实时统计信息?在线搜索,找不到合适的解决方案...
谢谢。

2 个答案:

答案 0 :(得分:2)

您可以将Spark的累加器用于此类目的。累加器提供了一种更新工作节点上的值并将这些值累加到Spark Driver上的方法。他们没有提供真正的“实时”统计信息,但绝对可以为您提供很好的进度估算。

在这种情况下,您可以创建一个累加器,该累加器仅对通过过滤器的记录进行计数:

// create accumulator on Driver
val counter = sc.longAccumulator("filtered")

// use it in function sent to Worker
val filteredData = seqRDD.filter { v =>
  counter.add(1)
  v < 10
}

// perform some action on filteredData...

// use accumulator's value method to get value in Driver at any given moment.
println(counter.value)

在上面的示例中,仅在完成后才“读取”累加器。但是,当counter.value上的操作仍在运行时,您可以从其他线程访问filteredData,并获得“部分”结果。这是一个显示以下内容的简单示例:

// partitioning the data - otherwise accumulator would 
// probably only get updated for all data at once:
val seqRDD = sc.parallelize(1 to 1000, 20)

// create accumulator
val counter = sc.longAccumulator("filtered")

// schedule TimerTask to print current value of accumulator every 50 milis:
val t = new java.util.Timer()
t.schedule(new java.util.TimerTask {
  def run() = println(counter.value)
}, 10L, 50L)

// apply filter
val filteredData = seqRDD.filter { v =>
  counter.add(1)
  Thread.sleep(5)
  v < 10
}

// perform action:
filteredData.collect()

t.cancel()

这将在操作运行时打印counter.value,并且输出类似于: 0 0 0 0 0 0 0 200 200 200 200 200 400 400 400 400 400 450 600 600 600 600 600 700 800 800 800 800 900

答案 1 :(得分:0)

假设一个示例方案。

可以说我有一个文件,其中有空白行。我想计算这些空白行并对其进行过滤。

示例文件:

Hello World

这是示例文件

使用累加器计算空白行。

代码:

val accum = sc.accumulator(0,"testAccum")

scala> rddFile.filter{ x =>
 | if(x == "")
 | {
 | accum += 1
 | }
 | x != ""
 | }


accum.value

请先收集作为过滤器结果的rdd,然后再打印“累加”值

这将打印文件中可用的空白行数。如果您想知道处理了多少行,只需取消if条件。