首页 > 解决方案 > Spark 数据框列命名约定/限制

问题描述

现在,我的 (Py)Spark 列名的默认命名(从收到的 .csv 文件导入)已经多次遇到问题。似乎与 Spark 混淆的东西是 MixedCase 和 . 或 - 在列名中。所以我决定找出实际保存的列名,并发现以下内容:

该网站似乎建议仅使用小写名称:

Hive 将表、字段名称以小写形式存储在 Hive Metastore 中。Spark 保留了 Dataframe、Parquet Files 中字段名称的大小写。当使用 Spark SQL 创建/访问表时,Spark 会保留大小写敏感性,并将详细信息存储在表属性中(在 hive 元存储中)。当使用 Hive Metastore 通过 Spark SQL 访问 parquet 记录时,这会导致奇怪的行为。

Amazon Athena似乎证实了这一点,并补充说“_”是唯一的保存特殊字符:

...但 Spark 需要小写的表名和列名。

Athena 表、视图、数据库和列名称不能包含除下划线 (_) 以外的特殊字符。

我从中得到的是,如果可能的话,我应该尝试只使用小写的列名,用 _ 作为单词之间的分隔符,以确保与我的 Spark 工作流程中可能出现的工具的最大交叉兼容性。这个对吗?是否有理由更喜欢空格而不是下划线,还有什么需要考虑的吗?

我意识到,在许多情况下,将所有列重命名为上述模式时,我可能会做得过火——但是,我宁愿避免在项目中间遇到与命名相关的麻烦,因为有时我发现这些错误很难调试。

标签: apache-sparkhivepysparknaming-conventionsamazon-athena

解决方案


将文件保存为 Parquet 格式时,不能使用空格和某些特定字符。我在从 CSV 读取和写入 Parquet 时遇到了类似的问题。以下代码为我解决了这个问题:

# Column headers: lower case + remove spaces and the following characters: ,;{}()=  
newColumns = []
problematic_chars = ',;{}()='
for column in df.columns:
    column = column.lower()
    column = column.replace(' ', '_')
    for c in problematic_chars:
        column = column.replace(c, '')
    newColumns.append(column)
df = df.toDF(*newColumns)

所以是的,如果你的目标是确保最大的交叉兼容性,你应该确保你的列名都是小写的,只有 _ 作为分隔符。


推荐阅读