我多次遇到(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工作流程。 这是正确的吗?是否有理由比下划线更喜欢空格,还有其他需要考虑的东西吗?
我意识到,在很多情况下,当将所有列重命名为上述模式时,我可能会过分执行-但是,我宁愿避免在项目中间遇到与命名相关的麻烦,因为有时我很难调试这些错误。
答案 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)
是的,如果您的目标是确保最大的交叉兼容性,则应确保您的列名全部为小写,仅用_作为分隔符。