Hive 在SQL中添加列,并在配置单元或BigQuery中使用行计数
我有一张像这样的桌子Hive 在SQL中添加列,并在配置单元或BigQuery中使用行计数,hive,google-bigquery,Hive,Google Bigquery,我有一张像这样的桌子 with temp_table as ( select 'john1', 100 union all select 'john2', 500 union all select 'john3', 700 union all select 'john4', 800 union all select 'john5', 200 union all select 'john6', 600 union all select 'john7', 300 ) select * from te
with temp_table as (
select 'john1', 100
union all
select 'john2', 500
union all
select 'john3', 700
union all
select 'john4', 800
union all
select 'john5', 200
union all
select 'john6', 600
union all
select 'john7', 300
)
select * from temp_table
数据看起来像-
john1,100
john2,500
john3,700
john4,800
john5,200
john6,600
john7,300
我想在这个表中再添加一列,它告诉我整个表的记录数。例如,当前表的记录总数为7
。所以我的输出应该是这样的-
john1,100,7
john2,500,7
john3,700,7
john4,800,7
john5,200,7
john6,600,7
john7,300,7
最有效的方法是什么?这是否可以在不进行join
操作的情况下实现
注意-这是一个示例数据,但实际上该表可能相当大(>5M条记录)以下是BigQuery标准SQL示例
#standardSQL
WITH temp_table AS (
SELECT 'john1' name, 100 value UNION ALL
SELECT 'john2', 500 UNION ALL
SELECT 'john3', 700 UNION ALL
SELECT 'john4', 800 UNION ALL
SELECT 'john5', 200 UNION ALL
SELECT 'john6', 600 UNION ALL
SELECT 'john7', 300
), totals AS (
SELECT COUNT(1) total_count FROM temp_table
)
SELECT *
FROM temp_table, totals
或
我的偏好是第一个
两者的返回都低于结果
Row name value total_count
1 john1 100 7
2 john2 500 7
3 john3 700 7
4 john4 800 7
5 john5 200 7
6 john6 600 7
7 john7 300 7
下面是BigQuery标准SQL的示例
#standardSQL
WITH temp_table AS (
SELECT 'john1' name, 100 value UNION ALL
SELECT 'john2', 500 UNION ALL
SELECT 'john3', 700 UNION ALL
SELECT 'john4', 800 UNION ALL
SELECT 'john5', 200 UNION ALL
SELECT 'john6', 600 UNION ALL
SELECT 'john7', 300
), totals AS (
SELECT COUNT(1) total_count FROM temp_table
)
SELECT *
FROM temp_table, totals
或
我的偏好是第一个
两者的返回都低于结果
Row name value total_count
1 john1 100 7
2 john2 500 7
3 john3 700 7
4 john4 800 7
5 john5 200 7
6 john6 600 7
7 john7 300 7
使用带有over子句和的配置单元
窗口
函数count(*)将不会指定任何分区依据和顺序依据子句
WITH temp_table AS (
SELECT 'john1' name, 100 value UNION ALL
SELECT 'john2', 500 UNION ALL
SELECT 'john3', 700 UNION ALL
SELECT 'john4', 800 UNION ALL
SELECT 'john5', 200 UNION ALL
SELECT 'john6', 600 UNION ALL
SELECT 'john7', 300
)
select *,count(*) over() count from temp_table;
输出:
+------------------+-------------------+--------+--+
| temp_table.name | temp_table.value | count |
+------------------+-------------------+--------+--+
| john1 | 100 | 7 |
| john7 | 300 | 7 |
| john6 | 600 | 7 |
| john3 | 700 | 7 |
| john2 | 500 | 7 |
| john5 | 200 | 7 |
| john4 | 800 | 7 |
+------------------+-------------------+--------+--+
使用带有over子句和的配置单元
窗口
函数count(*)将不会指定任何分区依据和顺序依据子句
WITH temp_table AS (
SELECT 'john1' name, 100 value UNION ALL
SELECT 'john2', 500 UNION ALL
SELECT 'john3', 700 UNION ALL
SELECT 'john4', 800 UNION ALL
SELECT 'john5', 200 UNION ALL
SELECT 'john6', 600 UNION ALL
SELECT 'john7', 300
)
select *,count(*) over() count from temp_table;
输出:
+------------------+-------------------+--------+--+
| temp_table.name | temp_table.value | count |
+------------------+-------------------+--------+--+
| john1 | 100 | 7 |
| john7 | 300 | 7 |
| john6 | 600 | 7 |
| john3 | 700 | 7 |
| john2 | 500 | 7 |
| john5 | 200 | 7 |
| john4 | 800 | 7 |
+------------------+-------------------+--------+--+
当然,解决方案1看起来不错,但这是否意味着它将执行交叉联接?实际上-是的,它是具有单行数据集的交叉联接。这里糟糕的不是交叉连接本身,它将被转换为映射连接并将快速执行,但是
total\u count
dataset将作为额外的完整扫描单独执行。所以,表将被扫描两次。一个-用于总计数,第二个-正常扫描+交叉连接(读取表格期间快速映射连接)。使用分析计数可以完全消除额外的扫描。如果我错了,请纠正我当然解决方案1看起来不错,但这是否意味着它将执行交叉连接?实际上-是的,它是一个具有单行数据集的交叉连接。这里糟糕的不是交叉连接本身,它将被转换为映射连接并将快速执行,但是total\u count
dataset将作为额外的完整扫描单独执行。所以,表将被扫描两次。一个-用于总计数,第二个-正常扫描+交叉连接(读取表格期间快速映射连接)。使用分析计数可以完全消除额外的扫描。如果我错了,请纠正我