使用Lambda函数过滤单个列上的Spark数据集

时间:2018-10-24 18:00:34

标签: scala apache-spark lambda filtering apache-spark-dataset

我正在尝试通过避免对每一行进行反序列化来加快过滤速度,因为我的数据集包含大量行。我想允许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函数时效果很好。与上述解决方案相比,我正在寻找的解决方案需要及时便宜(即一次传递整个数据集)

0 个答案:

没有答案