将Spark输出合并为单个文件

时间:2019-05-15 03:39:45

标签: apache-spark pyspark

我想知道使用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”输出到单个文件,而不是包含零件的文件夹。

3 个答案:

答案 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和数据帧的更多详细信息,请参考下一个链接:

Difference between DataFrame, Dataset, and RDD in Spark

https://databricks.com/blog/2016/07/14/a-tale-of-three-apache-spark-apis-rdds-dataframes-and-datasets.html

答案 2 :(得分:0)

您可以将其存储为parquet格式。这是适合HDFS的最佳格式

all_urls.write.parquet("dir_name")