2015-08-08 115 views
0

我正在使用Spark Java API。我正在尝试从目录读取文件并过滤出一些行。我的代码看起来像这样:用过滤器读取的火花

final JavaSparkContext jsc = new JavaSparkContext(sparkConf); 
JavaRDD<String> textFile = jsc .textFile("/path/to/some/file"); 

//First Read.... 
JavaRDD<Msg> parsedMessages = textFile.map(....); 

//Then Filter 
JavaRDD<Msg> queryResults = parsedMessages.filter(....) 

是否有一种方法可以将读取和过滤操作组合到同一个操作中?像用过滤器阅读的东西?我有一个非常具体的要求,我必须查询一个非常大的数据集,但我得到一个相对较小的结果集。然后我必须对那些过滤的数据进行一系列转换和计算。我不想将整个数据集读入内存,然后将其过滤掉。我没有那么多的记忆。我想要做的是在读取时对其进行过滤,以便只读取与某些正则表达式匹配的行。这可能与Spark有关吗?

回答

1

至少与SparkContext.textFile没有这样的选项,但它不应该是一个问题。没有要求所有数据必须在除了收集驱动程序之外的任何点驻留在内存中。数据以区块形式读取,您可以使用minPartitions参数减小单个拆分的大小。

我的建议是尽快使用正常的filter操作,并且persist会导致RDD避免重新计算。

2

Spark并不会完全按照您编写代码的方式执行代码 - 它会通过优化器。写入代码的方式(读取,映射和过滤 - 两者之间没有混洗动作)spark会在读取每行时实际执行读取,映射转换和过滤器 - 即它不需要所有数据在内存中