我正在尝试通过避免对每一行进行反序列化来加快过滤速度,因为我的数据集包含大量行。我想允许spark根据单个列(例如col1
)进行过滤,从而避免反序列化整个行。另外,我关心返回一个Dataset[MyEntry]
,类似于输入而不是返回Dataset[Row]
。
// The three filteres were broadcasted as a Map
// with the key being the name of the filter and value being
// the filter itself
// dataSet is Dataset[MyEntry]
case class MyEntry(col1: Int, col2: Int, col3: Int)
val allFilterNames = Array("one","two","three")
dataSet.filter(value => {
def foo(value: MyEntry): Boolean = {
var found = false
for (entry <- allFilterNames) {
if (broadcastVariable.value.get(entry).get.contains(value.col1)) {
return true
}
}
found
}
foo(value)
})
上下文:我正在尝试根据地图中包含的一组广播集成员资格结构(例如Bloom过滤器)过滤Spark Dataset列(键:过滤器名称,值:实际过滤器) 。我想检查(例如3)广播过滤器中是否存在列的值。如果该值存在,那么将保留整行。否则,将对行进行过滤。我使用了lambda函数,它可以正常工作。但是,这样做的代价是每次我执行检查时都会整行反序列化。我想通过在单列上应用相同的函数来避免这种开销(即允许spark反序列化单列而不是整个行)。上面的代码在使用lambda函数时效果很好。与上述解决方案相比,我正在寻找的解决方案需要及时便宜(即一次传递整个数据集)