【问题标题】:Python hdfs : Cannot read filePython hdfs:无法读取文件
【发布时间】:2016-09-04 04:11:06
【问题描述】:

我正在尝试使用 python as 从 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

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

:)

【问题讨论】:

  • 不要运行“json.load(f)” - 你能尝试执行“json.loads(f)”吗?
  • TypeError: expected string or buffer
  • print f 给出&lt;requests.packages.urllib3.response.HTTPResponse object at 0x0000000006768K0G1&gt; 所以它显然是某种对象。有没有办法使用requests.get() 阅读此内容
  • stackoverflow.com/a/16924225/5088142 - 说明您可以使用 object..raw.read(10) 读取 requests.packages.urllib3.response.HTTPResponse 对象 - 例如f.raw.read(10)
  • 请在下面添加您的解决方案作为答案,而不是将其添加到问题中

标签: python json hadoop hdfs python-requests


【解决方案1】:
 with cl.read('/myDir/myFile.json', encoding='utf-8') as reader:
       from json import load
        model = load(reader)

【讨论】:

  • 这是我首先尝试的。我得到UnicodeDecodeError: 'utf8' codec can't decode byte 0x8b in position 1: invalid start byte
  • 您是否从print cl.list("/myDir/") 获得列表。上面的帖子没有。
  • 好的。它与您拥有的 json 文件有关。你从print f 看到了什么字符串。它看起来像可打印的字符吗?
【解决方案2】:

您是否尝试过以下方法之一:

这些应该允许以非常简单的方式读取文件作为 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'}

【讨论】:

  • 蛇咬太棒了!谢谢。我想我也可以使用 cl.cat 读取文件,但仍然无法使用 json.load() 或 json.loads() 将其转换为 json。我认为这与 json 库有关。有什么建议吗?
  • 谢谢你!我想到了。请参阅编辑。正如他之前发布的那样,我不得不接受@Yaron 的回答。我只是无法弄清楚解码部分。
  • @AbtPst np - 顺便说一句,答案中也添加了带有 json 的示例
【解决方案3】:

1) 请参阅pypi.python.org/pypi/hdfs - 我会一步一步地按照他们的示例进行操作(这看起来与您所做的非常相似) - 并确保问题不在 python 代码中。 2)下一步是确认/myDir/myFile.json确实存在于HDFS中,并且持有一个有效的json文件。

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

【讨论】:

  • 这行得通!但是,我仍然无法使用 json.load() 或 json.loads() 将其转换为 json。我认为这与 json 库有关。有什么建议吗?
  • 你能分享一下你想用json.load读取的原始数据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-13
  • 2019-10-25
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多