在不更改列名的情况下创建 PySpark 数据框

Posted

技术标签:

【中文标题】在不更改列名的情况下创建 PySpark 数据框【英文标题】:Creating PySpark data frame without any alterations in column names 【发布时间】:2019-12-23 10:29:16 【问题描述】:

我正在使用SparkSQL 和下面的CTAS 命令创建表。

CREATE TABLE TBL2
STORED AS ORC 
LOCATION "dbfs:/loc"  
TBLPROPERTIES("orc.compress" = "SNAPPY")
AS
SELECT Col1
       , ColNext2
       , ColNext3
       , ... 
FROM TBL1  

之后,我正在使用下面的PySpark 代码读取位于新创建位置 (TBL2) 之上的文件。但是,下面的data frame 仅使用lowercase 中的所有列名创建。而预期结果在camel case 中,就像我在上面对CTAS 所做的那样。

df = spark.read.format('ORC') \
     .option('inferSchema',True) \
     .option('header',True) \
     .load('dbfs:/loc')

data_frame.show()

实际输出:

col1 colnext2 colnext3 ...

预期输出:

Col1 ColNext2 ColNext2 ...

【问题讨论】:

【参考方案1】:

在 2.3 及更早版本中,当从 Parquet 数据源表中读取时,无论 spark.sql.caseSensitive 是否设置为对或错。从 2.4 开始,当 spark.sql.caseSensitive 设置为 false 时,Spark 会在 Hive Metastore schema 和 Parquet schema 之间进行不区分大小写的列名解析,因此即使列名的字母大小写不同,Spark 也会返回相应的列值。如果存在歧义,即匹配多个 Parquet 列,则会引发异常。当 spark.sql.hive.convertMetastoreParquet 设置为 true 时,此更改也适用于 Parquet Hive 表。 source

【讨论】:

以上是关于在不更改列名的情况下创建 PySpark 数据框的主要内容,如果未能解决你的问题,请参考以下文章

在不使用熊猫的情况下将数据框转换为pyspark中的字典

比较 Pyspark 中的列名

如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?

如何在不转换为火花数据集的情况下遍历数据框?

映射 dict(来自 rdd)以递归方式更改 Python/PySpark 中的列名

如何比较两个忽略列名的数据框?