Python hdfs:无法读取文件

时间:2016-05-09 13:36:27

标签: python json hadoop hdfs python-requests

我正在尝试使用python作为

从hdfds读取文件
from hdfs.client import Client
import json,requests
if __name__ == '__main__':
    cl = Client("http://hostName:port")
    print cl.list("/myDir/")
    with cl.read("/myDir/myFile.json") as f:
        print f
        print json.load(f)

但是我得到了

raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

on json.load(f)

我也试过

with cl.read("/myDir/myFile.json", encoding ="utf-8") as f:

但现在我

UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte
然后我试了

with cl.read("/myDir/myFile.json",encoding ="utf-8", errors='ignore') as f:

但是我得到了

TypeError: read() got an unexpected keyword argument 'errors'

有什么方法可以将文件作为简单的字符串读取?该文件看起来像

{"key1":"val1","key2":"val2","key3":"val3"...}

我正在使用python 2.7

更新

感谢@Yaron提供了有用的建议。经过一番摆弄,我想出了这个

r=requests.get('http://hostName:port/webhdfs/v1/myDir/myFile.json?op=OPEN', stream=True)
r.raw.decode_content = True
print r
print str(r.raw.read())

但是,由于某种原因,它不会读取整个文件。它只是停在中间,我不知道为什么。有什么想法吗?

另外,我仍然无法将其转换为JSON。我试过了

r=requests.get('http://hostName:port/webhdfs/v1/myDir/myFile.json?op=OPEN', stream=True)
r.raw.decode_content = True
print r
x=r.raw.read()
# print x["key1"] fails citing that string indices must be integers
print x
x=json.loads(str(x))

我得到了

UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 0: invalid start byte

回到1号广场!

终于明白了

所有我必须做的是

r=requests.get('http://hostName:port/webhdfs/v1/myDir/myFile.json?op=OPEN', stream=True)
r.raw.decode_content = True
print r
x=r.raw.read().decode("utf-8",errors="ignore")
print json.loads(x)["key1"]

这给了我

<Response [200]>
value2

:)

3 个答案:

答案 0 :(得分:1)

你试过以下其中一个:

这些应该允许非常简单的方式来读取文件作为 python 中的简单内容。这些是纯python hdfs客户端,而不是web / http hdfs包装器。

以蛇咬为例,它将是:

from snakebite.client import AutoConfigClient
c = AutoConfigClient()
next(c.text([“/user/r/foobar.txt"]))
`awesome foobar content`

编辑:说到json的例子:

> jq . test.json
{
   "bar": "test",
   "foo": 1
}
> hdfs dfs -put test.json
> snakebite cat test.json | jq .
{
   "bar": "test",
   "foo": 1
}
> python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from snakebite.client import AutoConfigClient
>>> c = AutoConfigClient()
>>> import simplejson as json
>>> next(c.text(["test.json"]))
'{"foo": 1, "bar": "test"}\n'
>>> json.loads(next(c.text(["test.json"])))
{'foo': 1, 'bar': 'test'}

答案 1 :(得分:1)

1)看pypi.python.org/pypi/hdfs - 我会一步一步地看他们的例子(看起来和你做的非常相似) - 并确保问题不在python代码中。 2)下一步是确认HDFS中实际存在/myDir/myFile.json,并保存有效的json文件。

stackoverflow.com/a/16924225/5088142 - 说明您可以使用requests.packages.urllib3.response.HTTPResponse阅读object.raw.read(10)个对象 - 例如f.raw.read(10)

答案 2 :(得分:0)

 with cl.read('/myDir/myFile.json', encoding='utf-8') as reader:
       from json import load
        model = load(reader)