我想知道使用Spark时是否可以将最终结果合并为一个文件?这是我的代码:
conf = SparkConf().setAppName("logs").setMaster("local[*]")
sc = SparkContext(conf = conf)
logs_1 = sc.textFile('logs/logs_1.tsv')
logs_2 = sc.textFile('logs/logs_2.tsv')
url_1 = logs_1.map(lambda line: line.split("\t")[2])
url_2 = logs_2.map(lambda line: line.split("\t")[2])
all_urls = uls_1.intersection(urls_2)
all_urls = all_urls.filter(lambda url: url != "localhost")
all_urls.collect()
all_urls.saveAsTextFile('logs.csv')
collect()方法似乎不起作用(或者我误解了它的用途)。本质上,我需要“ saveAsTextFile”输出到单个文件,而不是包含零件的文件夹。
答案 0 :(得分:2)
好吧,在保存之前,您可以重新分区一次,如下所示:
let strNumber: NSString = self.text as NSString // TextView Text
let range = (strNumber).range(of: strNumber as String)
let attribute = NSMutableAttributedString.init(string: strNumber as String)
attribute.addAttributes([NSAttributedString.Key.font : UIFont.systemFont(ofSize: 14) , NSAttributedString.Key.foregroundColor : UIColor.red], range: range)
self.attributedText = attribute
那么您将只得到一个结果文件。
答案 1 :(得分:2)
请在下面找到一些建议:
collect()
和saveAsTextFile()
是动作,表示它们将在驱动程序节点上收集结果。因此,调用它们两个都是多余的。
对于您而言,您只需要使用saveAsTextFile()
存储数据,就无需调用collect()
。
collect()
返回项目数组(在您的情况下,您不使用返回的变量)
正如Glennie和Akash建议的那样,只需使用coalesce(1)
来强制一个分区。 coalesce(1)
不会引起改组,因此效率更高。
在给定的代码中,您正在使用Spark的RDD API,我建议改为使用数据框/数据集。
有关RDD和数据帧的更多详细信息,请参考下一个链接:
答案 2 :(得分:0)
您可以将其存储为parquet
格式。这是适合HDFS的最佳格式
all_urls.write.parquet("dir_name")