我正在处理HDP群集,并且正在尝试使用 pyarrow 从HDFS读取 .csv 文件。我可以使用 info()函数连接到hdfs并打印有关文件的信息。但是当涉及到读取文件的内容时,我会收到一个 pyarrow.lib.ArrowIOError 。问题的根源可能是什么?
这是我正在执行的代码
# IMPORTS
import pyarrow as pa
from pyarrow import csv
import os
import subprocess
# GET HDFS CLASSPATH
classpath = subprocess.Popen(["/usr/hdp/current/hadoop-client/bin/hdfs", "classpath", "--glob"], stdout=subprocess.PIPE).communicate()[0]
# CONFIGURE ENVIRONMENT VARIABLES
os.environ["HADOOP_HOME"] = "/usr/hdp/current/hadoop-client"
os.environ["JAVA_HOME"] = "/home/G60070/installs/jdk1.8.0_201/"
os.environ["CLASSPATH"] = classpath.decode("utf-8")
os.environ["ARROW_LIBHDFS_DIR"] = "/usr/hdp/2.6.5.0-292/usr/lib/"
# USING PYARROW
## connect to hdfs
fs = pa.hdfs.connect("xxxxxxx.xxx.xxx.fr", 8020)
file = 'hdfs://xxxxxxx.xxx.xxx.fr:8020/user/F43479/trip_data_v2.csv'
print(str(fs.info(file))) # this instruction works well
## read csv file
csv_file = csv.read_csv(file) # this one doesn't work as expected
csv_file
根据pyarrow documentation,我应该得到 csv列的列表。
但是我收到此错误: pyarrow.lib.ArrowIOError:无法打开本地文件:hdfs://xxxxxxx.xxx.xxx.fr:8020 / user / F43479 / trip_data_v2.csv,错误:找不到文件
首先,我以为我写错了文件路径。我检查了hdfs,文件在那里。
[F43479@xxxxx dask_tests]$ hdfs dfs -ls /user/F43479/
Found 9 items
-rw-r----- 3 F43479 hdfs 0 2019-03-07 16:42 /user/F43479/-
drwx------ - F43479 hdfs 0 2019-04-03 02:00 /user/F43479/.Trash
drwxr-x--- - F43479 hdfs 0 2019-03-13 16:53 /user/F43479/.hiveJars
drwxr-x--- - F43479 hdfs 0 2019-03-13 16:52 /user/F43479/hive
drwxr-x--- - F43479 hdfs 0 2019-03-15 13:23 /user/F43479/nyctaxi_trip_data
-rw-r----- 3 F43479 hdfs 36 2019-04-15 11:13 /user/F43479/test.csv
-rw-r----- 3 F43479 hdfs 50486731416 2019-03-26 17:37 /user/F43479/trip_data.csv
-rw-r----- 3 F43479 hdfs 5097056230 2019-04-15 13:57 /user/F43479/trip_data_v2.csv
-rw-r----- 3 F43479 hdfs 504867312828 2019-04-02 11:15 /user/F43479/trip_data_x10.csv
问题的根源是什么?
感谢您的潜在帮助。
答案 0 :(得分:0)
尝试通过HadoopFileSystem
对象打开文件:
with fs.open(file, 'rb') as f:
## read csv file
csv_file = csv.read_csv(f)