确保 Impala 查询得到具体化
Ensure that Impala query gets materialized
是否有任何可靠且有效的方法来确保 impala 查询结果在不将结果打印到控制台的情况下得到完全具体化?
作为示例,我将使用 INNER JOIN 查询。
具体化查询结果的明显方法是 创建 table 为 select.
CREATE TABLE t3 STORED AS PARQUET AS SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id;
它的问题是它写入磁盘因此效率低下。我正在寻找执行查询并确保结果具体化的最有效方法。
例如,在 Spark 中,我可以使用 .cache
方法,然后使用 .count
来确保查询被实现。
val t3 = t1.join(t2, "id")
t3.cache
t3.count
我可以尝试使用子查询解决方法。
SELECT COUNT(*) FROM (SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id) t3;
但我仍然需要确保子查询被具体化,如果查询优化器发现我只对总数感兴趣,这并不明显。也许有一些提示可以强制执行该操作或其他技巧?
据我所知,你不能用 Impala 做到这一点,而且永远也做不到。
Cloudera 专门设计该工具以支持 BI 工具,例如 Tableau、Qlik、MicroStrategy 等——但不支持 ad hoc ETL 脚本。
另一方面,Hive 现在附带了一个 "HPL-SQL" 过程语言包装器,可能会满足您的需要。注意事项:
- 需要 Hive 2.0+
- 需要 运行 你的整个脚本 在 HPL-SQL 解释器中,而不是基本的 Hive 客户端(也不是标准的 JDBC 连接)
并且 HPL-SQL 工具 声称它还 [=24=] 支持 Impala 查询 但我从未调查过那种说法。可以解决您的问题,作为一种笨拙的解决方法。
参考文献:
HIVE-11055(PL/HQL 工具为 Hive 代码库做出了贡献)
HPL/SQL website
说到解决方法,为什么不按照您自己的建议使用 Spark?您可以阅读 Impala/Hive 表,使用 Spark 本机 Parquet 库,或者使用自定义 JDBC 连接到 Impala 守护进程。本质上它类似于 HPL/SQL 解决方案。
是否有任何可靠且有效的方法来确保 impala 查询结果在不将结果打印到控制台的情况下得到完全具体化? 作为示例,我将使用 INNER JOIN 查询。
具体化查询结果的明显方法是 创建 table 为 select.
CREATE TABLE t3 STORED AS PARQUET AS SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id;
它的问题是它写入磁盘因此效率低下。我正在寻找执行查询并确保结果具体化的最有效方法。
例如,在 Spark 中,我可以使用 .cache
方法,然后使用 .count
来确保查询被实现。
val t3 = t1.join(t2, "id")
t3.cache
t3.count
我可以尝试使用子查询解决方法。
SELECT COUNT(*) FROM (SELECT t1.* FROM t1 INNER JOIN t2 ON t1.id=t2.id) t3;
但我仍然需要确保子查询被具体化,如果查询优化器发现我只对总数感兴趣,这并不明显。也许有一些提示可以强制执行该操作或其他技巧?
据我所知,你不能用 Impala 做到这一点,而且永远也做不到。
Cloudera 专门设计该工具以支持 BI 工具,例如 Tableau、Qlik、MicroStrategy 等——但不支持 ad hoc ETL 脚本。
另一方面,Hive 现在附带了一个 "HPL-SQL" 过程语言包装器,可能会满足您的需要。注意事项:
- 需要 Hive 2.0+
- 需要 运行 你的整个脚本 在 HPL-SQL 解释器中,而不是基本的 Hive 客户端(也不是标准的 JDBC 连接)
并且 HPL-SQL 工具 声称它还 [=24=] 支持 Impala 查询 但我从未调查过那种说法。可以解决您的问题,作为一种笨拙的解决方法。
参考文献:
HIVE-11055(PL/HQL 工具为 Hive 代码库做出了贡献)
HPL/SQL website
说到解决方法,为什么不按照您自己的建议使用 Spark?您可以阅读 Impala/Hive 表,使用 Spark 本机 Parquet 库,或者使用自定义 JDBC 连接到 Impala 守护进程。本质上它类似于 HPL/SQL 解决方案。