Python从HDFS读取文件作为流

发布于 2021-01-29 19:35:15

这是我的问题:我在HDFS中有一个文件,该文件可能很大(=不足以容纳所有内存)

我想做的是避免必须将此文件缓存在内存中,而仅像逐行处理常规文件一样逐行处理它:

for line in open("myfile", "r"):
    # do some processing

我正在寻找是否有一种简单的方法可以在不使用外部库的情况下正确完成此操作。我可能可以使它与libpyhdfspython-
hdfs一起使用,
但我想尽可能避免在系统中引入新的依赖项和未经测试的库,尤其是因为这两个似乎都没有得到大量维护,并声明不应用于生产。

我当时在考虑使用Pythonsubprocess模块使用标准的“
hadoop”命令行工具来执行此操作,但是由于没有命令行工具可以进行处理,因此我似乎无法执行所需的操作,并且我想以流式方式为每行执行Python函数。

有没有一种方法可以使用subprocess模块​​将Python函数用作管道的正确操作数?甚至更好,像打开文件一样将其作为生成器打开,这样我就可以轻松地处理每一行?

cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)

如果有另一种方法可以在不使用外部库的情况下实现上述功能,那么我也很开放。

谢谢你的帮助 !

关注者
0
被浏览
79
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您需要xreadlines,它可以从文件读取行而不将整个文件加载到内存中。

    编辑

    现在,我看到了您的问题,您只需要从Popen对象中获取stdout管道即可:

    cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
    for line in cat.stdout:
        print line
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看