2017-02-13 77 views
2

我有一个文件夹,我必须处理很多子目录。我决定找Linux的工具来查找所有文件,如如何输入stdin数据作为输入火花脚本

find . -name *.gz -exec zcat {} \; 

现在我得给stdout数据火花脚本作为输入类似以下

find . -name *.gz -exec zcat {} \; | ./run_pyspark.py 

是否有可能为火花读取标准输入数据(就像简单的python一样)。请给出一些例子或方法至少?

+0

注意:这不适用于分布式环境。 –

+0

我知道,但我必须在同一个系统上使用它(本地模式) – Shafiq

回答

0

也许试试这个:

import subprocess 
file_data=subprocess.call(['find', '.', '-name','*.gz',.....]) 
0

你可以使用一个技巧是通过管道过程通过你的论点。参考文档

pipe(命令,env = None,checkCode = False) 将由管道元素创建的RDD返回到派生外部进程。

>>> sc.parallelize(['1', '2', '', '3']).pipe('cat').collect()` 
[u'1', u'2', u'', u'3']` 

所以,你可以在你的脚本是这样的:

test = sc.parallelize([1]) 
data = test.pipe("find . -name *.gz -exec zcat {}") 

然而,这是不是很有效。如果你想要的是能够读取你的目录中的所有的gzip文件,只需将路径传递到您的文件,如

data = sc.textFile("/path/to/files/*gz") 
data.take(3) ## take a sample of records 

就这么简单。也适用于bz2文件。