在不更改列名的情况下创建 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 数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?