我有一个基本操作-过滤数据帧/ rdd。
val sc = ...
val seqRDD = sc.parallelize(1 to 10)
val filteredData = seqRDD.filter(v => v < 10)
... count / other actions...
我想获取有关此过滤器中已经处理了多少行的实时统计信息。或者,完成了多少百分比的过滤器。
如何获得实时统计信息?在线搜索,找不到合适的解决方案...
谢谢。
答案 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条件。