我是impala的新手,我需要用select resultset创建表,而且这个sql是用jdbc在java中运行的,请看下面的查询:
create table if not exists my_temp_table as select
41 as rule_id,49 as record_id,
(select count(1) as val from dirty_table where msg regexp '^[1]([3-9])[0-9]{9}$' )/(select count(1) from dirty_table);
我需要创建表 my_temp_table
在这个表中插入数据,这是我需要运行的一个sql。但运行失败,错误如下:
[HY000][500051] [Cloudera][ImpalaJDBCDriver](500051) ERROR processing query/statement. Error Code: 0, SQL state: TStatus(statusCode:ERROR_STATUS, sqlState:HY000, errorMessage:ParseException: Syntax error
经过检查,我知道 Impala 不支持 SELECT
子句子查询,只能在中使用子查询 FROM
或者 WHERE
条款,见impala文件:https://impala.apache.org/docs/build/html/topics/impala_subqueries.html.
所以对于这个问题我该怎么做才能解决这个问题。
我的想法:
更新sql让它执行,我试过了 WITH
就像下面的sql一样,它可以工作,但不能在 CREATE TABLE ... AS ...
.
WITH q1 AS (
select count(1) as val from dirty_table where msg regexp '^[1]([3-9])[0-9]{9}$'
),
q2 AS (
select count(1) val2 from dirty_table
)
SELECT 100 * q1.val / q2.val2 result
FROM q1, q2
或者,有这样的说法吗 BEGIN ... END
在mysql或oracle中,我可以分别运行这个sql。
2条答案
按热度按时间e3bfsja21#
我认为条件平均法可以简单有效地完成你想要的,只需一次表扫描:
你可以把这个变成一个
create table
声明:mqkwyuun2#
以你的例子,我会尝试这些方法,我相信,可以很好地工作。我和 Impala 核对了溶液
第一个例子
第二个例子