我实施的是:
val sparkConf = new SparkConf().setAppName(“SharedRDD”).setMaster(“local”)
val sc = SparkContext.getOrCreate(sparkConf)
val sparkRDD = sc.wholeTextFiles("sample.csv", 10)
此RDD由IgniteContext缓存
val igniteContext = new IgniteContext(sc, “example-shared-rdd.xml”, false)
val sharedIgniteRDD = igniteContext.fromCache[String, String](“cachedIgniteRDD”)
if (sharedIgniteRDD.isEmpty())
sharedIgniteRDD.savePairs(sparkRDD)
现在,如果任何spark作业需要访问此RDD,则无需创建新的RDD而是从点火缓存中检索它。
val RDDfromCache = igniteContext.fromCache[String, String](“CachedIgniteRDD”)
输入文件的示例数据
25/07/13,11599,CLOSED
25/07/13,256,PENDING_PAYMENT
25/07/13,12111,COMPLETE
25/07/13,8827,CLOSED
25/07/13,11318,COMPLETE
25/07/13,7130,COMPLETE
25/07/13,4530,COMPLETE
25/07/13,2911,PROCESSING
25/07/13,5657,PENDING_PAYMENT
25/07/13,5648,PENDING_PAYMENT
我需要调用groupByKey()API来对该输入文件的status列进行分组。
您的帮助将不胜感激。
谢谢
答案 0 :(得分:1)
使用cache
或persist
应避免再次重新创建rdd
。您可以选择保存rdds
in-memory
,memory-disk
,serialized
,deserialized
等。IgniteContext
是上述解决方案的替代方案。
groupByKey
对rdd
IgniteContext
的{{1}}有点棘手,因为您已使用wholeTextFile
来阅读文本文件。 WholeTextFile
将生成的Tuple2
rdd("文本文件的路径","文本行 s")
阅读已保存的rdd
fromCache
IgniteContext
val RDDfromCache = igniteContext.fromCache[String, String](“CachedIgniteRDD”)
您可以对groupByKey
val groupedRDD = RDDfromCache.flatMap(x => x._2.split("\n")).map(array => (array.split(",")(2), array)).groupByKey().foreach(println)
输出
(CLOSED,CompactBuffer(25/07/13,11599,CLOSED, 25/07/13,8827,CLOSED))
(PENDING_PAYMENT,CompactBuffer(25/07/13,256,PENDING_PAYMENT, 25/07/13,5657,PENDING_PAYMENT, 25/07/13,5648,PENDING_PAYMENT))
............
..........
..........
答案 1 :(得分:0)
wholeTextFiles
将整个文件放入一个条目中,因此将它保存在Ignite中并没有多大意义。您基本上会有一个分布式缓存,其中包含一个大条目。这并没有提供任何好处。
您应首先拆分文件并将每行保存为单独的元组。然后,您可以将此数据保存在Ignite中,并使用RDD API进行处理。