我有大约700个avro文件,每个大约2gb。我必须从这些avro文件中grep一个unix id,比如'129384755',并且需要获得找到这个id的avro文件名。
由于unix grep需要花费大量时间,因此我尝试为它写下sparkscala代码,下面是我的代码。
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf
object SparkGrep {
def main(args: Array[String]) {
if (args.length < 3) {
System.err.println("Usage: SparkGrep <host> <input_file> <match_term>")
System.exit(1)
}
val conf = new SparkConf().setAppName("SparkGrep").setMaster(args(0))
val sc = new SparkContext(conf)
val inputFile = sc.textFile(args(1), 2).cache()
val matchTerm : String = args(2)
val numMatches = inputFile.filter(line => line.contains(matchTerm)).count()
println("%s lines in %s contain %s".format(numMatches, args(1), matchTerm))
System.exit(0)
}
}
但我遇到的问题是
我在700个文件上运行了这段代码,参数(2)为///.avro。我希望///part-123.avro中的4行输出包含我的id“129384755”。但与此相反,我得到的输出是“4行in///.avro contain”,我将如何知道这700个文件中的文件名,其中我的搜索变量(它是唯一的,并且只在700个文件中的一个文件中)是唯一的。你能帮帮我吗。从你这一方面来说真的很有帮助。
1条答案
按热度按时间ndh0cuux1#
你的问题有很多问题。你把它的措辞弄得很混乱。下次请做得更好。
“我在700个文件上运行了这段代码”:我假设这意味着args(1)是一个带有通配符的文件的目录路径
在spark中有多种方法可以做到这一点。如果你想坚持使用RDD,文件就必须很小。可能有1000多行。这就是方法,下面是我的spark shell输出:
输出如下:
不过,我建议您改用Dataframe:
输出如下所示:
testfile.txt和testfile2.txt这两个文件都在/testfoler目录下
以下是这些文件的内容:
testfile.txt文件
testfile2.txt文件