我是否可以将 ORC 文件视为类似于 CSV 文件,其中列标题和行标签包含数据?如果是这样,我可以以某种方式将其读入一个简单的 pandas 数据框吗?我对 Hadoop 或 Spark 等工具不太熟悉,但是为了在 Python 中查看本地 ORC 文件的内容,是否有必要了解它们?
文件名是
someFile.snappy.orc
我可以在网上看到
spark.read.orc('someFile.snappy.orc')
有效,但即使在 import pyspark
之后,它也会抛出错误。
我还没有找到任何好的选择,有一些死项目试图包装java阅读器。但是,pyarrow 确实有一个 ORC 阅读器,不需要您使用 pyspark。虽然有一点限制,但确实有效。
import pandas as pd
import pyarrow.orc as orc
with open(filename, 'rb') as file:
data = orc.ORCFile(file)
df = data.read().to_pandas()
如果
import pyarrow.orc as orc
不起作用(在 Windows 10 中对我不起作用),您可以将它们读取到 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()
从 Pandas 1.0.0 开始,Pandas 内置了一个函数。
https://pandas.pydata.org/docs/reference/api/pandas.read_orc.html
import pandas as pd
import pyarrow.orc
df = pd.read_orc('/tmp/your_df.orc')
请务必阅读此有关依赖项的警告。此功能可能无法在 Windows 上使用 https://pandas.pydata.org/docs/getting_started/install.html#install-warn-orc
如果您想使用 read_orc(),强烈建议使用conda安装pyarrow
最简单的方法是使用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)
ORC 与 AVRO 和 PARQUET 一样,都是专门为海量存储而设计的格式。您可以将它们想象为“像 csv”,它们都是包含数据的文件,具有特定的结构(与 csv 不同,当然也不同于 json!)。
一旦您的环境授予 Hive 支持,使用
pyspark
应该很容易 读取 orc 文件。
回答你的问题,我不确定在没有 Hive 的本地环境中你是否能够阅读它,我从来没有这样做过(你可以使用以下代码进行快速测试):
加载 ORC 文件,以 DataFrame 形式返回结果。
注意:目前 ORC 支持仅与 Hive 支持一起提供。
>>> df = Spark.read.orc('python/test_support/sql/orc_partitioned')
Hive 是一个数据仓库系统,它允许您像传统关系数据库一样通过 Map-Reduce 查询 HDFS(分布式文件系统)上的数据(创建类似 SQL 的查询,不支持 100% 所有标准 SQL 功能! ).
编辑:尝试以下操作来创建新的 Spark 会话。不想粗鲁,但我建议您遵循众多 PySpark 教程之一,以了解这个“世界”的基础知识。一切都会变得更加清晰。
import findspark
findspark.init()
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('Test').getOrCreate()
我不想提交 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()