apache-spark - 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 工作流程中可能出现的工具的最大交叉兼容性。这个对吗?是否有理由更喜欢空格而不是下划线,还有什么需要考虑的吗?
我意识到,在许多情况下,将所有列重命名为上述模式时,我可能会做得过火——但是,我宁愿避免在项目中间遇到与命名相关的麻烦,因为有时我发现这些错误很难调试。
解决方案
将文件保存为 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)
所以是的,如果你的目标是确保最大的交叉兼容性,你应该确保你的列名都是小写的,只有 _ 作为分隔符。
推荐阅读
- javascript - 何时移除组件中的骨架屏幕?
- java - 无法在 android 中获取广告 ID 提供者
- java - 使用用户输入创建 2 个维度数组并查找特定列的总和
- ios - 如何在 iOS Swift 中剪切部分 CALayer?
- css - 使用html和css的组织结构图
- amazon-web-services - 无法通过 EC2 实例中的公共 IP 访问我的弹性搜索
- python-2.7 - RuntimeError:运行循环已在 pyttsx 中启动
- laravel - 产品详情页面未显示
- java - 带有用户输入的插入排序双数组 - JAVA
- php - 如何从数据库创建 JSON 树