这是我的问题:我在HDFS中有一个文件,该文件可能很大(=不足以容纳所有内存)
我想做的是避免必须将此文件缓存在内存中,而仅像逐行处理常规文件一样逐行处理它:
for line in open("myfile", "r"):
# do some processing
我正在寻找是否有一种简单的方法可以在不使用外部库的情况下正确完成此操作。我可能可以使它与libpyhdfs或python-
hdfs一起使用,
但我想尽可能避免在系统中引入新的依赖项和未经测试的库,尤其是因为这两个似乎都没有得到大量维护,并声明不应用于生产。
我当时在考虑使用Pythonsubprocess
模块使用标准的“
hadoop”命令行工具来执行此操作,但是由于没有命令行工具可以进行处理,因此我似乎无法执行所需的操作,并且我想以流式方式为每行执行Python函数。
有没有一种方法可以使用subprocess模块将Python函数用作管道的正确操作数?甚至更好,像打开文件一样将其作为生成器打开,这样我就可以轻松地处理每一行?
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
如果有另一种方法可以在不使用外部库的情况下实现上述功能,那么我也很开放。
谢谢你的帮助 !
您需要xreadlines,它可以从文件读取行而不将整个文件加载到内存中。
编辑 :
现在,我看到了您的问题,您只需要从Popen
对象中获取stdout管道即可:
cat = subprocess.Popen(["hadoop", "fs", "-cat", "/path/to/myfile"], stdout=subprocess.PIPE)
for line in cat.stdout:
print line
所以我必须检索存储在HDFS中的文件的内容,并对其进行某些分析。 问题是,我甚至无法读取文件并将其内容写入本地文件系统中的另一个文本文件。(我是Flink的新手,这只是一个测试,以确保我正确读取了文件) HDFS中的文件是纯文本文件。这是我的密码: 在我运行/tmp之后,它没有输出。 这是一个非常简单的代码,我不确定它是否有问题,或者我只是做了一些别的错误。正如我所说,我对Flink完全是新手 此
我有一个大的(>500M行)CSV文件。这个CSV文件中的每一行都包含一个位于HDFS上的二进制文件的路径。我想使用Spark读取这些文件中的每一个,处理它们,并将结果写到另一个CSV文件或表中。 在驱动程序中执行此操作非常简单,下面的代码完成了这项工作 但是失败 是否可以让执行者直接访问HDFS文件或HDFS文件系统?或者,是否有一种有效的方法来读取HDFS/S3上数百万个二进制文件并用Spar
问题内容: 我正在尝试使用该模块从python脚本读取json文件。经过一番谷歌搜索后,我发现以下代码: json文件的路径和名称在哪里。我收到以下错误: 问题答案: 该代码用作变量名。它将阴影您导入的模块引用。为变量使用其他名称。 除此之外,代码在接受字符串的同时传递文件对象。 传递文件内容: 或使用接受类似文件的对象。
问题内容: 我有点头疼,只是因为一个简单,易于表达的陈述使我的脸上有些错误。 我有一个名为的文件,如下所示: 我现在想读取文件。我发现了以下这些语句,但是不起作用: 控制台上显示的错误是这样的: 已编辑 从更改为 并得到了: 问题答案: 该方法( 中没有 )可以直接读取文件: 你正在使用方法,该方法仅用于字符串参数。 编辑:新消息是一个完全不同的问题。在这种情况下,该文件中存在一些无效的。为此,我
问题内容: 我有一个包含多个词典的文件,如下所示: 或这个: 换句话说,每个词典中每个键的顺序都不相同。 我的问题: 最好的阅读本词典的方式是什么,以便无论顺序如何都可以调用Date,GenName和Segment?那可能吗? 请注意…这不是来自json文件。如果字典的构造不正确,我确定可以修改生成此输出的脚本。 问题答案: 正如您在评论中提到的,您要自己创建字典,因此以痛苦的格式存储字典并不是一
我有一个简单的Hadoop安装有点麻烦。我已经下载了hadoop 2.4.0并安装在一个CentOSLinux节点(虚拟机)上。我已经为apache站点(http://hadoop.apache.org/docs/r2.4.0/hadoop-project-dist/hadoop-common/SingleCluster.html)上描述的具有伪分布的单个节点配置了hadoop。它从日志中没有问题