Читать паркетные файлы из 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()
Другие вопросы по тегам