Spark数据框列命名约定/限制

时间:2018-10-26 14:05:14

标签: apache-spark hive pyspark naming-conventions amazon-athena

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

This website似乎只建议使用小写字母:

  

Hive将表和字段名称以小写形式存储在Hive Metastore中。   Spark在Dataframe和Parquet Files中保留字段名称的大小写。   使用Spark SQL创建/访问表时,Spark保留区分大小写的功能,将详细信息存储在表属性(在配置单元metastore中)中。当使用Hive Metastore通过Spark SQL访问镶木地板记录时,这会导致奇怪的行为。

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

  

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

     

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

我从中得到的是,如果有可能,我应该尝试仅使用小写的列名,并以_作为单词之间的分隔符,以确保与可能出现在我本人中的工具具有最大的交叉兼容性。 Spark工作流程。 这是正确的吗?是否有理由比下划线更喜欢空格,还有其他需要考虑的东西吗?

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

1 个答案:

答案 0 :(得分:2)

将文件保存为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)

是的,如果您的目标是确保最大的交叉兼容性,则应确保您的列名全部为小写,仅用_作为分隔符。