如何在spark中使用saveAsTextFile命名文件?

Hun*_*nle 7 apache-spark rdd pyspark

在spark版本1.5.1中保存为文本文件时,我使用: rdd.saveAsTextFile('<drectory>').

但是,如果我想在该目录中找到该文件,我该如何命名它我想要的?

目前,我认为它是命名的part-00000,必须是默认的.我该如何命名?

小智 8

这个问题的正确答案是saveAsTextFile不允许您命名实际文件.

这样做的原因是数据被分区并在作为调用参数给出的路径中saveAsTextFile(...),它将其视为目录,然后为每个分区写入一个文件.

你可以打电话 rdd.coalesce(1).saveAsTextFile('/some/path/somewhere'),它会创建/some/path/somewhere/part-0000.txt.

如果你需要比这更多的控制,你需要在你做完后进行实际的文件操作rdd.collect().

请注意,这会将所有数据拉入一个执行程序,因此您可能会遇到内存问题.这就是你冒的风险.


Alb*_*nto 7

正如我在上面的评论中所说,可以在此处找到带有示例的文档.并引用方法的描述saveAsTextFile:

使用元素的字符串表示将此RDD保存为文本文件.

在下面的示例中,我将一个简单的RDD保存到文件中,然后加载它并打印其内容.

samples = sc.parallelize([
    ("abonsanto@fakemail.com", "Alberto", "Bonsanto"),
    ("mbonsanto@fakemail.com", "Miguel", "Bonsanto"),
    ("stranger@fakemail.com", "Stranger", "Weirdo"),
    ("dbonsanto@fakemail.com", "Dakota", "Bonsanto")
])

print samples.collect()

samples.saveAsTextFile("folder/here.txt")
read_rdd = sc.textFile("folder/here.txt")

read_rdd.collect()
Run Code Online (Sandbox Code Playgroud)

输出将是

('abonsanto@fakemail.com', 'Alberto', 'Bonsanto')
('mbonsanto@fakemail.com', 'Miguel', 'Bonsanto')
('stranger@fakemail.com', 'Stranger', 'Weirdo')
('dbonsanto@fakemail.com', 'Dakota', 'Bonsanto')

[u"('abonsanto@fakemail.com', 'Alberto', 'Bonsanto')",
 u"('mbonsanto@fakemail.com', 'Miguel', 'Bonsanto')",
 u"('stranger@fakemail.com', 'Stranger', 'Weirdo')",
 u"('dbonsanto@fakemail.com', 'Dakota', 'Bonsanto')"]
Run Code Online (Sandbox Code Playgroud)

我们来看看使用基于Unix的终端.

usr@host:~/folder/here.txt$ cat *
('abonsanto@fakemail.com', 'Alberto', 'Bonsanto')
('mbonsanto@fakemail.com', 'Miguel', 'Bonsanto')
('stranger@fakemail.com', 'Stranger', 'Weirdo')
('dbonsanto@fakemail.com', 'Dakota', 'Bonsanto')
Run Code Online (Sandbox Code Playgroud)