Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 在SQL中添加列,并在配置单元或BigQuery中使用行计数_Hive_Google Bigquery - Fatal编程技术网

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将作为额外的完整扫描单独执行。所以,表将被扫描两次。一个-用于总计数,第二个-正常扫描+交叉连接(读取表格期间快速映射连接)。使用分析计数可以完全消除额外的扫描。如果我错了,请纠正我