最近学习hive,
构建表是
交易信息号,卡号,银行卡类型,购买商店
想要得到信息是购买A商铺的卡,有多少购买B商铺,还有列出购买A铺所有卡的个数。
就是平时网购店铺推荐排名
先建个bankbuy
create table bankbuy (id int, bankcard string,bank string,store string) row format delimited fields terminated by '\t'
建个bankbuy.txt
1 0001 nonghang Astore
2 0001 nonghang Bstore
3 0001 nonghang Cstore
4 0002 nonghang Astore
5 0003 nonghang Dstore
6 0005 nonghang Cstore
7 0006 nonghang Astore
8 0004 nonghang Bstore
9 0006 nonghang Bstore
10 0003 nonghang Cstore
11 0005 nonghang Bstore
12 0002 nonghang Astore
13 0006 nonghang Astore
14 0004 nonghang Dstore
15 0007 nonghang Cstore
16 0005 nonghang Fstore
17 0005 nonghang Estore
18 0002 nonghang Cstore
导入数据 load data local inpath '/home/hdadmin/hadoop/ziliao/bankbuy.txt' overwrite into table bankbuy;
然后新建一个表abbank
create table abbank(astore string,bstore string) row format delimitated fields by '\t'
将一个卡号购买过的两个商店插入abbank;
hive> insert overwritetable abbank
> select abs.store,bbs.store from
> (select * from bankbuy) abs
> join (select * from bankbuy) bbs
> onabs.bankcard=bbs.bankcard whereabs.store<>bbs.store;
Astore Cstore
Bstore Astore
Bstore Cstore
Cstore Astore
Cstore Bstore
Astore Cstore
Dstore Cstore
Cstore Bstore
Cstore Fstore
Cstore Estore
Astore Bstore
Bstore Dstore
Bstore Astore
Bstore Astore
Cstore Dstore
Bstore Cstore
Bstore Fstore
Bstore Estore
Astore Cstore
Astore Bstore
Dstore Bstore
Fstore Cstore
Fstore Bstore
Fstore Estore
Estore Cstore
Estore Bstore
Estore Fstore
Cstore Astore
但whereabs.store<>bbs.store;有些问题,本来想去掉 1 0001 nonghang Astore 1 0001 nonghang Astore (查询结果为 Astore Astore)
这样的情况,但是如果出现15 0002 nonghang Astore, 按道理说,虽然两次都是同一卡购买同一家商店,但是id号不一样,就是购买不是同一次。
按这个语法也去掉了。 需要改进。
然后继续查询
hive> select * from (
> select astore,bstore,count(1) fromabbank group by astore,bstore) bb
> left outer join (selectstore,count(bankcard) from bankbuy group by store) cc
> onbb.astore=cc.store;
结果是:
OK
Astore Bstore 3 Astore 5
Astore Cstore 3 Astore 5
Bstore Astore 3 Bstore 4
Bstore Cstore 2 Bstore 4
Bstore Dstore 1 Bstore 4
Bstore Estore 1 Bstore 4
Bstore Fstore 1 Bstore 4
Cstore Astore 3 Cstore 5
Cstore Bstore 2 Cstore 5
Cstore Dstore 1 Cstore 5
Cstore Estore 1 Cstore 5
Cstore Fstore 1 Cstore 5
Dstore Bstore 1 Dstore 2
Dstore Cstore 1 Dstore 2
Estore Bstore 1 Estore 1
Estore Cstore 1 Estore 1
Estore Fstore 1 Estore 1
Fstore Bstore 1 Fstore 1
Fstore Cstore 1 Fstore 1
Fstore Estore 1 Fstore 1
想去掉绿字那列。 * 这个地方需要改进。个人想select bb.astore ,bb.bstore ,bb.count(1),cc.count(bancard) from .....
但bb.count(1),cc.count(bankcard)老是出错,没查到合适的写法。
所做搜索结果
第一列是购买A商铺,第二列是购买A商铺购买其他商铺的如B,第三列是购买A又购买B的个数,第四列是购买A所有的个数;
结果信息价值把购买A商铺的,向客户推荐购买B商铺,还需要把第三列排名。
需要进一步完善。