sparkDataframe列命名约定/限制

5gfr0r5j  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(421)

我已经多次遇到我的(py)spark列名的默认命名(从收到的.csv文件导入)问题。那些看起来像是打乱了Spark的东西是混杂在一起的。或者-在列名中。因此,我决定找出哪些列名是真正保存的,并发现了以下内容:
本网站似乎建议只使用小写字母:
配置单元在配置单元元存储中以小写形式存储表和字段名。spark在dataframe、parquet文件中保留字段名的大小写。当使用sparksql创建/访问表时,spark将细节存储在表属性中(在hivemetastore中),从而保持了区分大小写的能力。当使用hivemetastore通过sparksql访问Parquet记录时,这会导致一种奇怪的行为。
亚马逊雅典娜(amazon athena)似乎证实了这一点,并补充说“\”是唯一的特殊字符:
... 但是spark需要小写的表名和列名。
雅典娜表、视图、数据库和列名不能包含下划线(\以外的特殊字符)。
我从中得到的启示是,如果可能的话,我应该尽量只使用小写的列名,在单词之间使用∗作为分隔符,以确保与spark工作流中可能出现的工具具有最大的交叉兼容性。是这样吗?有理由选择空格而不是下划线吗?还有什么需要考虑的吗?
我意识到,在许多情况下,当我将所有列重命名为上述模式时,我可能会做得过火—但是,我宁愿避免在项目进行过程中遇到与命名相关的问题,因为我发现这些错误有时很难调试。

mutmk8jj

mutmk8jj1#

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

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

相关问题