Читать паркетные файлы из HDFS с помощью PyArrow
Я знаю, что могу подключиться к кластеру HDFS через Pyarrow, используя pyarrow.hdfs.connect()
Я также знаю, что могу прочитать файл паркета, используя pyarrow.parquet
"s read_table()
Тем не мение, read_table()
принимает путь к файлу, тогда как hdfs.connect()
дает мне HadoopFileSystem
пример.
Можно ли каким-то образом использовать просто pyarrow (с установленной libhdfs3), чтобы получить файл / папку паркета, находящийся в кластере HDFS? То, что я хочу получить, это to_pydict()
функции, то я могу передать данные.
3 ответа
Пытаться
fs = pa.hdfs.connect(...)
fs.read_parquet('/path/to/hdfs-file', **other_options)
или же
import pyarrow.parquet as pq
with fs.open(path) as f:
pq.read_table(f, **read_options)
Я открыл https://issues.apache.org/jira/browse/ARROW-1848 о добавлении более явной документации по этому вопросу.
Я пробовал то же самое с помощью библиотеки Pydoop и engine = pyarrow, и у меня это сработало идеально. Вот обобщенный метод.
!pip install pydoop pyarrow
import pydoop.hdfs as hd
#read files via Pydoop and return df
def readParquetFilesPydoop(path):
with hd.open(path) as f:
df = pd.read_parquet(f ,engine='pyarrow')
logger.info ('file: ' + path + ' : ' + str(df.shape))
return df
Вы можете читать и писать с помощью pyarrow, как показано в принятом ответе. Однако предоставленные там API давно устарели и не работают с последними версиями Hadoop. Использовать:
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()