Hive 元数据存储¶
Hive 元数据存储将 SQL 元数据与 Hadoop 文件系统 (HDFS) 上的文件相关联。它类似于 SQL 数据库,因为它包含有关 SQL 表的信息,但不同之处在于数据不存储在 Hive 中,而是以普通文件的形式保留在 HDFS 上。
Odo 主要通过 sqlalchemy 与 Hive 交互,由于其特殊性,也使用了少量自定义代码。
URI¶
Hive URI 与 SQLAlchemy 连接字符串以及 hive:// 协议完全匹配。此外,Impala 是 HDFS 上的另一个 SQL 数据库,也可以连接到相同的表。
hive://hostname
hive://user@hostname:port/database-name
hive://user@hostname:port/database-name::table-name
impala://hostname::table-name
此外,由于两者之间紧密的集成,您可能需要查阅有关 HDFS 的文档。
选项¶
除了标准的 SQL 之外,Hive 表还有一些非标准选项。
stored_as - File format on disk like TEXTFILE, PARQUET, ORC
path - Absolute path to file location on HDFS
external=True - Whether to keep the file external or move it to Hive
directory
有关更多信息,请参阅 Hive DDL 文档。
转换¶
我们通常将 CSV 文件加载到 Hive 中,这些文件可以来自 HDFS,也可以来自构成 HDFS 集群的其中一台机器上的本地磁盘。
HDFS(Directory(CSV)) -> Hive
SSH(Directory(CSV)) -> Hive
SSH(CSV) -> Hive
此外,我们可以使用 Hive 将这些数据高效地迁移到不同格式的新数据中。
Hive -> Hive
与所有通过 SQLAlchemy 的 SQL 系统一样,我们可以将 Hive 表转换为 Python 迭代器,尽管这会比较慢。
Hive -> Iterator
Impala¶
Impala 与 Hive 处理相同的数据,通常速度更快,但也有一些怪癖。
虽然 Impala 连接到相同的元数据存储,但它必须连接到其中一个工作节点,而不是 Hive 连接的同一主节点。将数据加载到 Hive 后,您需要向 Impala 发送 invalidate metadata 命令。
>>> odo('hdfs://hostname::/path/to/data/*.csv', 'hive://hostname::table')
>>> imp = resource('impala://workernode')
>>> imp.connect().execute('invalidate metadata')
这可以说是在未来 odo 应该处理的事情。在此之后,Hive 中的所有表也都可以供 Impala 使用。
您可能希望将数据转换为 Parquet 格式以进行高效查询。在 CSV 格式的 Hive 中进行两分钟的查询,在 Parquet 格式的 Hive 中可能只需要一分钟,而在 Parquet 格式的 Impala 中只需三秒。
>>> odo('hive://hostname::table', 'hive://hostname::table_parquet',
... external=False, stored_as='PARQUET')