文件名是`someFile.snappy.orc`。
我可以在线上看到`spark.read.orc('someFile.snappy.orc')`可以工作,但即使在导入了`pyspark`之后,它仍然会出现错误。
我还没有找到太好的选择,有一些已经停止维护的项目试图封装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()
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()
最简单的方法是使用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)
从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。
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作业来读取本地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()
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