【问题标题】:How to read an ORC file stored locally in Python Pandas?如何读取存储在 Python Pandas 中本地的 ORC 文件?
【发布时间】:2019-03-24 04:26:48
【问题描述】:

我可以将 ORC 文件视为类似于包含数据的列标题和行标签的 CSV 文件吗?如果是这样,我可以以某种方式将其读入一个简单的熊猫数据框吗?我对 Hadoop 或 Spark 等工具不太熟悉,但是否有必要了解它们才能在 Python 中查看本地 ORC 文件的内容?

文件名为someFile.snappy.orc

我可以在网上看到spark.read.orc('someFile.snappy.orc') 有效,但即使在import pyspark 之后,它也会抛出错误。

【问题讨论】:

    标签: python pandas pyspark data-science orc


    【解决方案1】:

    我还没有找到任何好的选择,有一些死项目试图包装 java 阅读器。但是,pyarrow 确实有一个不需要您使用 pyspark 的 ORC 阅读器。它有点受限,但它有效。

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

    【讨论】:

    • 就我而言,我需要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
    • pyarrow 与 Parquet 配合得很好,但使用 ORC 似乎存在一些问题。
    • @Vic 你应该用 'rb' 模式打开文件
    • 为什么pyarrow没有模块orc?那改变了吗? @Rafal Janik
    • 重启 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 27 ModuleNotFoundError: No module named 'pyarrow._orc'
    【解决方案2】:

    如果 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()
    

    【讨论】:

      【解决方案3】:

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

      使用pyspark 应该很容易reading an orc file,只要您的环境授予 Hive 支持。 回答您的问题,我不确定在没有 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,请注意 Pandas 是一个不同的库(即使它们都有自己的 DataFrame 实现,我猜这会造成混淆)。 Spark 旨在以分布式方式工作,Pandas 用于在单台 PC 上进行分析。
      • Spark 有一些开销,因为它需要创建上下文(并且 pyspark 是一个大型二进制文件)。我以前这样做过,但如果有其他选项,不建议这样做。
      【解决方案4】:

      从 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

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 2014-06-20
        • 2020-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-10
        • 1970-01-01
        • 2015-11-25
        相关资源
        最近更新 更多