有什么可靠和有效的方法来确保impala查询结果完全实现而不将结果打印到控制台吗?作为示例,我将使用 INNER JOIN 查询。
具体化查询结果的明显方法是将表创建为选择。
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;
但我仍然需要确保子查询已具体化,如果查询优化器发现我只对总数感兴趣,这并不明显。也许有一些提示可以强制执行或其他技巧?
AFAIK 你不能用黑斑羚做到这一点,也永远做不到。
Cloudera专门设计该工具来支持BI工具,如Tableau,Qlik,MicroStrategy等 - 但不支持临时ETL脚本。
另一方面,Hive现在附带了一个"HPL-SQL"过程语言包装器,可能适合你的需求。警告:
- 需要 Hive 2.0+
- 需要在 HPL-SQL 解释器中运行整个脚本,而不是在基本 Hive 客户端(也不是标准 JDBC 连接)中运行
HPL-SQL工具声称它也支持Impala查询,但我从未调查过这种说法。可以解决您的问题,作为一种笨拙的解决方法。
引用:
HIVE-11055(PL/HQL工具为Hive代码库做出了贡献)
HPL/SQL 网站
说到解决方法,为什么不像您自己建议的那样使用Spark?您可以使用 Spark 本机 Parquet 库或与 Impala 守护程序的自定义 JDBC 连接来读取 Impala/Hive 表。从本质上讲,它类似于HPL/SQL解决方案。