即使在使用 PySpark 读取 .ORC 文件时明确指定,也缺少标题

Posted

技术标签:

【中文标题】即使在使用 PySpark 读取 .ORC 文件时明确指定,也缺少标题【英文标题】:Headers missing even if explicitly specified when reading .ORC file with PySpark 【发布时间】:2019-01-08 10:12:05 【问题描述】:

这似乎是一个没有明确解决方案的小问题。我有一个 ORC 文件,如果将其表示为 CSV 文件,它将如下所示:

Animal,Name
Dog,Valentino
Cat,Meowser

等等。我可以在.orc 文件中读到:

df_animals = spark.read.orc(path="animals.orc")

从某种意义上说,它产生了一个有效的数据帧,但它包含数据中的标头,就好像它们是数据一样,产生以下数据帧:

+---------+---------------+
|      _c0|            _c1|
+---------+---------------+
|   Animal|           Name|
|      Dog|      Valentino|
|      Cat|        Meowser|

显然这不是我需要的,因为我无法引用任何实际的列名。但是,我已经尝试过:

spark.read.option("inferSchema", True).orc("animals.orc")

spark.read.option("header", True).orc("animals.orc")

spark.read.format("orc").load("animals.orc", schema=defined_schema)

其中defined_schema 是使用StructTypesStructFields 构造的有效模式-但结果始终相同,数据框类似于上面的示例。我知道我可以使用withColumnRenamed 来强制它们使用某些字符串,但这感觉很笨拙,考虑到文件中的标题应该是不必要的。我在这里错过了什么?

【问题讨论】:

我对 ORC 几乎没有经验,但我经常使用 parquet,我的经验是元数据(如列名)保存在单独的文件中 【参考方案1】:

这应该是开箱即用的,您不需要任何参数。 (如果未提供模式,OrcRelation 类会负责推断模式。)并且您的列名不应出现在行中。你应该检查你的输入文件,问题几乎肯定存在。

【讨论】:

这是正确的。在从原始 CSV 生成 ORC 文件时,我在读取原始 CSV 时没有使用 headers=True 标志。一旦我进行了更改,ORC 文件就有了正确的标题。

以上是关于即使在使用 PySpark 读取 .ORC 文件时明确指定,也缺少标题的主要内容,如果未能解决你的问题,请参考以下文章

PySpark 无法通过 sparkContext/hiveContext 读取 Hive ORC 事务表?我们可以使用 Pyspark 更新/删除配置单元表数据吗?

从 Pyspark 中读取文件后模拟流数据

Pyspark在使用大量列保存数据框时遇到问题

Pyspark 无法保存包含大量列的数据框

Java读取HDFS上的ORC格式文件

Pyspark:从路径读取多个 JSON 文件