从HDFS读取CSV文件并转换为数据框架

10
我正在使用pydoop从hdfs读取文件,当我使用以下代码时:
import pydoop.hdfs as hd
with hd.open("/home/file.csv") as f:
    print f.read()

它在标准输出中显示文件。
有没有办法将这个文件读入数据框?我尝试使用pandas的read_csv("/home/file.csv"),但它告诉我找不到文件。精确的代码和错误如下:
>>> import pandas as pd
>>> pd.read_csv("/home/file.csv")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 498, in parser_f
    return _read(filepath_or_buffer, kwds)
  File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 275, in _read
    parser = TextFileReader(filepath_or_buffer, **kwds)
  File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 590, in __init__
    self._make_engine(self.engine)
  File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 731, in _make_engine
    self._engine = CParserWrapper(self.f, **self.options)
  File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 1103, in __init__
    self._reader = _parser.TextReader(src, **kwds)
  File "pandas/parser.pyx", line 353, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:3246)
  File "pandas/parser.pyx", line 591, in pandas.parser.TextReader._setup_parser_source (pandas/parser.c:6111)
IOError: File /home/file.csv does not exist
4个回答

18

我对hdfs了解甚少,但我想知道以下内容是否可行:

with hd.open("/home/file.csv") as f:
    df =  pd.read_csv(f)

我假定read_csv可以使用文件句柄或者任何能够提供给它数据行的可迭代对象,这一点对于numpy的csv读取器同样适用。

如果Python普通的文件open函数能够读取该文件(即它是一个本地文件),那么pd.read_csv("/home/file.csv")就可以正常工作。

with open("/home/file.csv") as f: 
    print f.read()

但显然hd.open正在使用其他位置或协议,因此该文件不是本地文件。如果我的建议不起作用,则您(或我们)需要更深入地研究hdfs文档。


1
你可以使用以下代码从HDFS中读取CSV文件。
import pandas as pd
import pyarrow as pa
hdfs_config = {
     "host" : "XXX.XXX.XXX.XXX",
     "port" : 8020,
     "user" : "user"
}
fs = pa.hdfs.connect(hdfs_config['host'], hdfs_config['port'], 
user=hdfs_config['user'])
df=pd.read_csv(fs.open("/home/file.csv"))

0

使用read代替open,它会有效

with hd.read("/home/file.csv") as f:
    df =  pd.read_csv(f)

0

你可以使用pyarrow本地读写。我发现pydoop库有些笨拙并需要很多烦人的依赖关系。语法如下:

from pyarrow import fs
import pyarrow.parquet as pq

# connect to hadoop
hdfs = fs.HadoopFileSystem('hostname', 8020) 

# will read single file from hdfs
with hdfs.open_input_file(path) as pqt:
     df = pq.read_table(pqt).to_pandas()

# will read directory full of partitioned parquets (ie. from spark)
df = pq.ParquetDataset(path, hdfs).read().to_pandas()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接