我现在多次遇到 (Py)Spark 列名称的默认命名(从收到的 .csv 文件导入)的问题。混合大小写和 .或 - 在列名称中。所以我决定找出实际保存的列名,并发现以下内容:
这个网站 https://medium.com/@an_chee/why-using-mixed-case-field-names-in-hive-spark-sql-is-a-bad-idea-95da8b6ec1e0似乎建议仅使用小写名称:
Hive 在 Hive Metastore 中以小写形式存储表、字段名称。
Spark 保留 Dataframe、Parquet 文件中字段名称的大小写。
使用 Spark SQL 创建/访问表时,Spark 将详细信息存储在表属性(在 hive 元存储中)中,从而保留区分大小写。当使用 Hive Metastore 通过 Spark SQL 访问镶木地板记录时,这会导致奇怪的行为。
亚马逊雅典娜 https://docs.aws.amazon.com/athena/latest/ug/tables-databases-columns-names.html似乎证实了这一点,并补充说“_”是唯一的保存特殊字符:
...但是 Spark 需要小写的表名和列名。
Athena 表、视图、数据库和列名称不能包含特殊名称
字符,下划线 (_) 除外。
我从中得出的结论是,如果可能的话,我应该尝试仅使用小写列名,并使用 _ 作为单词之间的分隔符,以确保与 Spark 工作流程中可能出现的工具的最大交叉兼容性。它是否正确?是否有理由更喜欢空格而不是下划线,还有其他需要考虑的吗?
我意识到,在很多情况下,我might将所有列重命名为上述模式时做得太过分了 - 但是,我宁愿避免在项目中间遇到与命名相关的麻烦,因为我发现这些错误有时很难调试。
将文件保存为 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)
所以是的,如果您的目标是确保最大的交叉兼容性,您应该确保您的列名全部小写,仅使用 _ 作为分隔符。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)