我正在使用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有关吗?
答案 0 :(得分:2)
Spark不会完全按照你编写的方式执行代码 - 它通过优化器。这个代码的编写方式(读取,映射和过滤 - 中间没有任何改组动作)spark实际上会在读取每个行时执行读取,映射转换和过滤 - 即它不需要所有数据在记忆中
答案 1 :(得分:1)
至少SparkContext.textFile
没有这样的选择,但它不应该是一个问题。除收集驱动程序之外,不要求所有数据都必须驻留在内存中。数据以块的形式读取,您可以使用minPartitions
参数减小单个拆分的大小。
我的建议是尽快使用正常filter
操作并persist
生成RDD以避免重新计算。