如何在Python Pandas中读取本地存储的ORC文件?

14
我可以将ORC文件类比于带有列标题和行标签包含数据的CSV文件吗?如果可以,我是否可以将其读入一个简单的pandas dataframe中?我不太熟悉像Hadoop或Spark这样的工具,但是只为了在Python中查看本地ORC文件的内容就必须要理解它们吗?
文件名是`someFile.snappy.orc`。
我可以在线上看到`spark.read.orc('someFile.snappy.orc')`可以工作,但即使在导入了`pyspark`之后,它仍然会出现错误。
6个回答

10

我还没有找到太好的选择,有一些已经停止维护的项目试图封装Java读取器。然而,pyarrow确实有一个ORC读取器,不需要使用pyspark。它功能有点受限制,但它可以工作。

import pandas as pd
import pyarrow.orc as orc

with open(filename) as file:
    data = orc.ORCFile(file)
    df = data.read().to_pandas()

1
在我的情况下,我需要使用 with open(filename, 'rb') as file: 来避免解码错误 pyarrow.lib.ArrowIOError: Arrow error: IOError: 'utf-8' codec can't decode byte 0xfe in position 11: invalid start byte - Vic
pyarrow 在 Parquet 格式下表现非常好,但在 ORC 格式下似乎存在一些问题。 - Nikhil Redij
@Vic,你应该使用“rb”模式打开文件。 - jarandaf
1
为什么PyArrow没有ORC模块?这个情况改变了吗?@Rafal Janik - Augmented Jacob
重新启动Sagemaker实例后,我发现pyarrow._orc模块也不见了。之前它是可以工作的。`ModuleNotFoundError Traceback (most recent call last) <ipython-input-17-07bf84f8f5db> in <module>() 1 get_ipython().system('pip install pyarrow') ----> 2 from pyarrow import orc~/anaconda3/envs/python3/lib/python3.6/site-packages/pyarrow/orc.py in <module>() 23 from pyarrow import types 24 from pyarrow.lib import Schema ---> 25 import pyarrow._orc as _orc 26` - PHY6

4
如果在 Windows 10 中无法正常运行 import pyarrow.orc as orc (我就是这种情况),你可以将其读取为 Spark 数据框,然后转换为 pandas 的数据框。
import findspark
from pyspark.sql import SparkSession

findspark.init()
spark = SparkSession.builder.getOrCreate()
df_spark = spark.read.orc('example.orc')
df_pandas = df_spark.toPandas()

2

最简单的方法是使用pyorc

import pyorc
import pandas as pd

with open(r"my_orc_file.orc", "rb") as orc_file:
    reader = pyorc.Reader(orc_file)
    orc_data = reader.read()
    orc_schema = reader.schema

columns = list(orc_schema.fields)
df = pd.DataFrame(data=orc_data, columns=columns)

2

1

ORC,像AVRO和PARQUET一样,是专门为大规模存储而设计的格式。你可以把它们想象成“类似于csv”的文件,它们都包含数据,并具有它们自己的特定结构(当然不同于csv或json!)。

使用pyspark应该很容易读取orc文件,只要你的环境支持Hive。

回答你的问题,如果没有Hive支持的本地环境,我不确定你能否读取它,我从未尝试过(你可以通过以下代码进行快速测试):

加载ORC文件,将结果作为DataFrame返回。

注意:目前仅在支持Hive的情况下才支持ORC。

>>> df = spark.read.orc('python/test_support/sql/orc_partitioned')

Hive是一个数据仓库系统,允许你通过Map-Reduce在HDFS(分布式文件系统)上查询数据,就像传统关系数据库一样(创建类似SQL的查询,但不支持100%所有标准SQL功能!)。

编辑:尝试以下步骤创建一个新的Spark Session。不想无礼,但我建议您跟随众多PySpark教程之一,以便了解这个“世界”的基础知识。一切都会更清晰。

import findspark
findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('Test').getOrCreate()

我的示例与Spark一起工作,请注意,Pandas是一个不同的库(即使它们都有自己的DataFrame实现,这可能会造成混淆)。Spark被设计为以分布式方式工作,而Pandas适用于单个PC上的分析。 - Andrea
1
Spark有一些开销,因为它需要创建一个上下文(而且pyspark是一个大二进制文件)。我以前做过这个,但如果有其他选择的话,我不建议这样做。 - Jorge Leitao

0

我不想提交一个Spark作业来读取本地ORC文件或使用pandas。这对我很有效。

import pyarrow.orc as orc
data_reader = orc.ORCFile("/path/to/orc/part_file.zstd.orc")
data = data_reader.read()
source = data.to_pydict()

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