Spark用过滤器读取

时间:2015-08-08 05:51:45

标签: filter apache-spark

我正在使用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有关吗?

2 个答案:

答案 0 :(得分:2)

Spark不会完全按照你编写的方式执行代码 - 它通过优化器。这个代码的编写方式(读取,映射和过滤 - 中间没有任何改组动作)spark实际上会在读取每个行时执行读取,映射转换和过滤 - 即它不需要所有数据在记忆中

答案 1 :(得分:1)

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

我的建议是尽快使用正常filter操作并persist生成RDD以避免重新计算。