在 Impala 数据库中创建 table 作为 select 百分比子查询
Create table as select percentage subquery in Impala DB
我是 Impala 的新手,我需要用 select 结果集创建 table,另外,这个 sql 在 Java 使用 JDBC,请参阅我的以下查询:
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);
我需要创建 table my_temp_table
并将数据插入此 table,这是我需要 运行 的一个 SQL。但它 运行s 失败并给出如下错误:
[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
- 或者,MySQL或者Oracle中有没有类似
BEGIN ... END
的语句,那我可以运行这个sql单独
根据您的示例,我会尝试这些方法,我相信它们可以正常工作。
我用 Impala
检查了解决方案
CREATE TABLE dirty_table (
id INT,
msg STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
[localhost.localdomain:21000] > SELECT * FROM dirty_table;
Query: SELECT * FROM dirty_table
Query submitted at: 2020-07-28 17:05:24 (Coordinator: http://localhost.localdomain:25000)
Query progress can be monitored at: http://localhost.localdomain:25000/query_plan?query_id=5441d6a46ce61e7b:8e49432600000000
+----+-------------+
| id | msg |
+----+-------------+
| 1 | 13321512121 |
| 2 | 13121212121 |
| 3 | 03121212121 |
| 4 | 13321512121 |
| 5 | 13121212121 |
| 6 | 03121212121 |
| 7 | 13121212121 |
+----+-------------+
Fetched 7 row(s) in 0.14s
第一个例子
CREATE TABLE IF NOT EXISTS my_temp_table AS
SELECT 41 AS rule_id, 49 AS record_id, val1 / val2 AS result
FROM (SELECT COUNT(1) AS val1 FROM dirty_table WHERE msg regexp '^[1]([3-9])[0-9]{9}$' ) a,
(SELECT COUNT(1) AS val2 FROM dirty_table) b;
[localhost.localdomain:21000] > CREATE TABLE IF NOT EXISTS my_temp_table AS
> SELECT 41 AS rule_id, 49 AS record_id, val1 / val2 AS result
> FROM (SELECT COUNT(1) AS val1 FROM dirty_table WHERE msg regexp '^[1]([3-9])[0-9]{9}$' ) a,
> (SELECT COUNT(1) AS val2 FROM dirty_table) b;
Query: CREATE TABLE IF NOT EXISTS my_temp_table AS
SELECT 41 AS rule_id, 49 AS record_id, val1 / val2 AS result
FROM (SELECT COUNT(1) AS val1 FROM dirty_table WHERE msg regexp '^[1]([3-9])[0-9]{9}$' ) a,
(SELECT COUNT(1) AS val2 FROM dirty_table) b
+-------------------+
| summary |
+-------------------+
| Inserted 0 row(s) |
+-------------------+
Fetched 1 row(s) in 0.21s
[localhost.localdomain:21000] > invalidate metadata;
[localhost.localdomain:21000] > SELECT * FROM my_temp_table;
Query: select * from my_temp_table
Query submitted at: 2020-07-28 17:03:44 (Coordinator: http://localhost.localdomain:25000)
Query progress can be monitored at: http://localhost.localdomain:25000/query_plan?query_id=47370bf793a09b:29c4dfa000000000
+---------+-----------+--------------------+
| rule_id | record_id | result |
+---------+-----------+--------------------+
| 41 | 49 | 0.7142857142857143 |
+---------+-----------+--------------------+
Fetched 1 row(s) in 0.13s
第二个例子
DROP TABLE my_temp_table;
CREATE TABLE IF NOT EXISTS my_temp_table AS
SELECT result FROM
(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 AS result
FROM q1, q2) t;
[localhost.localdomain:21000] > CREATE TABLE IF NOT EXISTS my_temp_table AS
> SELECT result FROM
> (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 AS result
> FROM q1, q2) t;
Query: CREATE TABLE IF NOT EXISTS my_temp_table AS
SELECT result FROM
(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 AS result
FROM q1, q2) t
+-------------------+
| summary |
+-------------------+
| Inserted 1 row(s) |
+-------------------+
Fetched 1 row(s) in 0.40s
[localhost.localdomain:21000] > invalidate metadata;
[localhost.localdomain:21000] > SELECT * FROM my_temp_table;
Query: SELECT * FROM my_temp_table
Query submitted at: 2020-07-28 17:08:17 (Coordinator: http://localhost.localdomain:25000)
Query progress can be monitored at: http://localhost.localdomain:25000/query_plan?query_id=3447684ef59d0c4:f70779200000000
+-------------------+
| result |
+-------------------+
| 71.42857142857143 |
+-------------------+
Fetched 1 row(s) in 0.74s
我认为条件平均可以简单有效地完成您想要的操作,只需一次 table 扫描:
select avg(case when msg regexp '^[1]([3-9])[0-9]{9}$' then 100.0 else 0 end) result
from dirty_table
您可以将其转换为 create table
语句:
create table my_temp_table as
select avg(case when msg regexp '^[1]([3-9])[0-9]{9}$' then 100.0 else 0 end) result
from dirty_table
我是 Impala 的新手,我需要用 select 结果集创建 table,另外,这个 sql 在 Java 使用 JDBC,请参阅我的以下查询:
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);
我需要创建 table my_temp_table
并将数据插入此 table,这是我需要 运行 的一个 SQL。但它 运行s 失败并给出如下错误:
[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
- 或者,MySQL或者Oracle中有没有类似
BEGIN ... END
的语句,那我可以运行这个sql单独
根据您的示例,我会尝试这些方法,我相信它们可以正常工作。 我用 Impala
检查了解决方案CREATE TABLE dirty_table (
id INT,
msg STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
[localhost.localdomain:21000] > SELECT * FROM dirty_table;
Query: SELECT * FROM dirty_table
Query submitted at: 2020-07-28 17:05:24 (Coordinator: http://localhost.localdomain:25000)
Query progress can be monitored at: http://localhost.localdomain:25000/query_plan?query_id=5441d6a46ce61e7b:8e49432600000000
+----+-------------+
| id | msg |
+----+-------------+
| 1 | 13321512121 |
| 2 | 13121212121 |
| 3 | 03121212121 |
| 4 | 13321512121 |
| 5 | 13121212121 |
| 6 | 03121212121 |
| 7 | 13121212121 |
+----+-------------+
Fetched 7 row(s) in 0.14s
第一个例子
CREATE TABLE IF NOT EXISTS my_temp_table AS
SELECT 41 AS rule_id, 49 AS record_id, val1 / val2 AS result
FROM (SELECT COUNT(1) AS val1 FROM dirty_table WHERE msg regexp '^[1]([3-9])[0-9]{9}$' ) a,
(SELECT COUNT(1) AS val2 FROM dirty_table) b;
[localhost.localdomain:21000] > CREATE TABLE IF NOT EXISTS my_temp_table AS
> SELECT 41 AS rule_id, 49 AS record_id, val1 / val2 AS result
> FROM (SELECT COUNT(1) AS val1 FROM dirty_table WHERE msg regexp '^[1]([3-9])[0-9]{9}$' ) a,
> (SELECT COUNT(1) AS val2 FROM dirty_table) b;
Query: CREATE TABLE IF NOT EXISTS my_temp_table AS
SELECT 41 AS rule_id, 49 AS record_id, val1 / val2 AS result
FROM (SELECT COUNT(1) AS val1 FROM dirty_table WHERE msg regexp '^[1]([3-9])[0-9]{9}$' ) a,
(SELECT COUNT(1) AS val2 FROM dirty_table) b
+-------------------+
| summary |
+-------------------+
| Inserted 0 row(s) |
+-------------------+
Fetched 1 row(s) in 0.21s
[localhost.localdomain:21000] > invalidate metadata;
[localhost.localdomain:21000] > SELECT * FROM my_temp_table;
Query: select * from my_temp_table
Query submitted at: 2020-07-28 17:03:44 (Coordinator: http://localhost.localdomain:25000)
Query progress can be monitored at: http://localhost.localdomain:25000/query_plan?query_id=47370bf793a09b:29c4dfa000000000
+---------+-----------+--------------------+
| rule_id | record_id | result |
+---------+-----------+--------------------+
| 41 | 49 | 0.7142857142857143 |
+---------+-----------+--------------------+
Fetched 1 row(s) in 0.13s
第二个例子
DROP TABLE my_temp_table;
CREATE TABLE IF NOT EXISTS my_temp_table AS
SELECT result FROM
(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 AS result
FROM q1, q2) t;
[localhost.localdomain:21000] > CREATE TABLE IF NOT EXISTS my_temp_table AS
> SELECT result FROM
> (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 AS result
> FROM q1, q2) t;
Query: CREATE TABLE IF NOT EXISTS my_temp_table AS
SELECT result FROM
(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 AS result
FROM q1, q2) t
+-------------------+
| summary |
+-------------------+
| Inserted 1 row(s) |
+-------------------+
Fetched 1 row(s) in 0.40s
[localhost.localdomain:21000] > invalidate metadata;
[localhost.localdomain:21000] > SELECT * FROM my_temp_table;
Query: SELECT * FROM my_temp_table
Query submitted at: 2020-07-28 17:08:17 (Coordinator: http://localhost.localdomain:25000)
Query progress can be monitored at: http://localhost.localdomain:25000/query_plan?query_id=3447684ef59d0c4:f70779200000000
+-------------------+
| result |
+-------------------+
| 71.42857142857143 |
+-------------------+
Fetched 1 row(s) in 0.74s
我认为条件平均可以简单有效地完成您想要的操作,只需一次 table 扫描:
select avg(case when msg regexp '^[1]([3-9])[0-9]{9}$' then 100.0 else 0 end) result
from dirty_table
您可以将其转换为 create table
语句:
create table my_temp_table as
select avg(case when msg regexp '^[1]([3-9])[0-9]{9}$' then 100.0 else 0 end) result
from dirty_table