我在配置单元中有一个表,如下所示,
table1
Cola | Colb | Colc | Cold |
---------------------------------
...etc
efo18 691 123 5692
efo18 691 345 5657
...etc
fsx31 950 291 23456
fsx31 950 404 23456
fsx31 950 343 23456
fsx31 950 182 23456
fsx31 950 120 45042
fsx31 950 161 23456
....etc
klz57 490 121 3330
klz57 490 113 3330
klz57 490 308 3330
klz57 490 411 3330
klz57 490 161 3330
klz57 386 108 3330
klz57 490 113 3330
klz57 490 125 3330
klz57 490 165 3330
klz57 490 166 3330
...etc
---------------------------------
我想要table1
数据中的另一个表格
组中Cold
的值相同
在那之内,具有相同Colb
的人有一个子组
在该子组中,那些具有相同Cola
值的人属于一个组。
换句话说,Cola,Colb,Cold
的每个唯一组合都是一行。重复的行总结。
insert into table table2(Col1 string,Col2 string,Col3 string,Count int) select cola,colb,cold,count(*) from table1 group by cold,colb,cola;
我期待这一点,
Col1 | Col2 | Col3 | Count |
-------------------------------------
efo18 691 5692 1
efo18 691 5657 1
fsx31 950 23456 5 <-----1
fsx31 950 45042 1 <-----1
klz57 490 1234 9 <-----2
klz57 386 1234 1 <-----2
--------------------------------------
我明白了,
table2
Col1 | Col2 | Col3 | Count |
-------------------------------------
efo18 691 5692 1
efo18 691 5657 1
fsx31 950 23456 4 <-----1
fsx31 950 25456 1 <-----1
fsx31 950 45042 1 <-----1
klz57 490 1234 8 <-----2
klz57 386 1234 1 <-----2
klz57 490 1234 1 <-----2
--------------------------------------
我不明白的是,我正在Cold
然后在Colb
后跟Cola
进行分组。
为什么标记为(&lt; ---- 1)的行的Count
(来自Cola
的值)位于不同的行中,即使所有内容都属于同一组?
Colc
对于这两行是不同的,但我在分组sp时没有使用它,两行有何不同?
类似地,对于标记为(&lt; ---- 2)的行,这里有什么问题。
更新
Binary01,我正在尝试你给出的例子
hive> select * from xyz;
OK
x y z zz
xxx 111 222 123 NULL NULL NULL
xxx 111 222 123 NULL NULL NULL
xxx 101 222 123 NULL NULL NULL
xux 111 422 123 NULL NULL NULL
xxx 111 522 323 NULL NULL NULL
xyx 111 622 123 NULL NULL NULL
xxx 115 322 123 NULL NULL NULL
xxx 111 122 123 NULL NULL NULL
xxx 111 223 123 NULL NULL NULL
xxy 111 212 143 NULL NULL NULL
xxx 117 222 123 NULL NULL NULL
那些NULL值在那里做什么?我一行一行地复制了你的例子。甚至创建表格,
create table xyz(x string ,y string, z string , zz string)
row format delimited fields terminated by ',';
,最终查询给出,
hive> select * from xyztemp;
OK
xux 111 422 123 NULL NULL 1
xxx 101 222 123 NULL NULL 1
xxx 111 122 123 NULL NULL 1
xxx 111 222 123 NULL NULL 2
xxx 111 223 123 NULL NULL 1
xxx 111 522 323 NULL NULL 1
xxx 115 322 123 NULL NULL 1
xxx 117 222 123 NULL NULL 1
xxy 111 212 143 NULL NULL 1
xyx 111 622 123 NULL NULL 1
答案 0 :(得分:3)
你一定错过了什么。我尝试使用类似于您的表的以下数据,并按预期检查输出完全正常。
hive>set hive.cli.print.header=true;
hive> load data local inpath '/home/brdev/sudeep/testdata.txt' into table xyz;
hive> create table xyz(x string ,y string, z string , zz string) row format delimited fields terminated by ',';
hive> select * from xyz;
OK
x y z zz
xxx 111 222 123
xxx 111 222 123
xxx 101 222 123
xux 111 422 123
xxx 111 522 323
xyx 111 622 123
xxx 115 322 123
xxx 111 122 123
xxx 111 223 123
xxy 111 212 143
xxx 117 222 123
hive>create table xyztemp ( aa string,bb string,cc string , dd int);
hive>insert into table xyztemp select x,y,zz,count(*) from xyz group by zz,y,x;
hive> select * from xyztemp;
OK
aa bb cc dd
xxx 101 123 1
xux 111 123 1
xxx 111 123 4
xyx 111 123 1
xxx 115 123 1
xxx 117 123 1
xxy 111 143 1
xxx 111 323 1
我猜以上是您正在寻找的预期输出。
答案 1 :(得分:1)
不确定这是否存在问题,但在列值在某些行中有前导或尾随空格的情况下,我看到了类似的结果。 Hive不会将'fsx31'
和'fsx31 '
(注意后者的尾随空格)视为相同的值,因此在分组时会为它们提供单独的行。
当您使用TRIM
删除前导和尾随空格时会发生什么情况?
INSERT INTO table table2(Col1 STRING, Col2 STRING, Col3 STRING, Count INT)
SELECT cola, colb, cold, count(*)
FROM (
SELECT
TRIM(cola) AS cola,
TRIM(colb) AS colb,
TRIM(colb) AS colb
FROM table1
)
GROUP BY cold, colb, cola;
(使用子查询修剪和别名列并不是绝对必要的,但我希望它有助于澄清意图是什么。)
希望有所帮助。