hive的join和复合数据类型

 

Hive对一下两个表进行join

 

 

hive> select * from table1;

OK

1       a

2       b

3       c

hive> select * from table2;

OK

1       e

2       f

4       d

两个表的格式都一样如下:

 

hive> desc table1;

OK

id      int

char    string

Hive不同版本对join的连接是不一样的。左外连接:

Select t1.char , t2.char from table1 t1 left outer join  table2 t2 on (t1.id = t2.id)结果如下

a       e

b       f

c       NULL

右外连接:

 Select t1.char , t2.char from table1 t1 right outer join table2 t2 on (t1.id = t2.id)结果如下:

a       e

b       f

NULL    d

 

全连接

Select t1.char , t2.char from table1 t1 full outer join table2 t2 on ( t1.id = t2.id)结果如下:

a       e

b       f

c       NULL

NULL    d

Hivemap join

加入join两张表的时候,其中一张表非常小(可以放在内存中),可以使用map-site join,即mapjoin,原理是将其中一张表加载每个mapper的内存中,从而不需要reducer即可完成join。但是map端的join不适合full/right outer join。另外注意一点事hive中对null的处理和一般的sql也是一致的但是在joinnull=null是有意义的,是成立的返回时true的。

 

 

 

Hive的复合数据类型

Hive有三种复合类型

Structarray , map

1.struct数据类型,通”.”’来查询的数据结构,例如:

数据类型如下:

1,liu:30

2,zhang:30

3,li:20

4,wang:80

创建表

Create table struct_test( id int , info struct<name String , age int>)

row format delimited 

fields terminated by ‘,’

collection items terminated by ‘:’

查询:

select info.age from struct_test ;

2.array数据类型,同一类数据放置到放置到一个column

数据类型如下:

liu,1:2:3:4

zhang,5:6

li,7:8:9

创建表:

create table array_test (name string , student_id_array array<int>)

row format delimited 

fields terminated by ‘,’

collecion items terminated by ‘:’

查询:

select student_id_array[1] from array_test;

需要注意的是hivearray数据类型的下表是从1开始的,没有空指针,如果没有值那么为null

3.map数据类型

 1 job:80,team:60,person:70

 2 job:60,team:80

 3 job:90,team:70,person:100

创建表:

 

 create table map_test(id int, perf map< string , int>)

 row format delimited

 fields terminated by '\t'

 collection items terminated  by ','

 map keys terminated by ':'

查询:

select perf[‘person’] from map_test;

结果:

60

80

70


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当在Hive中进行JOIN操作时,数据倾斜是一个常见的问题。数据倾斜是指在JOIN操作中某些数据分布不均匀,导致部分任务执行时间过长,而其他任务执行时间很短的情况。 以下是一些可以尝试的方法来处理数据倾斜问题: 1. 增加并行度:通过增加并行度来将任务分散到更多的节点上。可以使用以下方式来增加并行度: - 设置MapReduce任务的数量(mapreduce.job.reduces)。 - 使用Hive的特殊配置参数,如hive.exec.reducers.bytes.per.reducer和hive.exec.reducers.max。 - 使用Distribute By或Cluster By子句来更好地分发数据。 2. 优化表结构:考虑对表进行合理的分区和存储格式设计,以便更好地利用并行处理能力。合理的表分区和存储格式可以减少数据倾斜的发生。 3. 使用Bucketing:Bucketing是一种将数据划分为固定数量的桶,并将数据均匀地分布在这些桶中的方法。通过使用Bucketing,可以减少JOIN操作中数据倾斜的影响。 4. 考虑使用Map-side Join:如果一个表很小而另一个表很大,可以考虑使用Map-side Join。Map-side Join会将小表完全加载到内存中,并在Map阶段进行JOIN操作,避免了数据倾斜的问题。 5. 使用随机数进行均匀分布:如果数据倾斜发生在某些特定的列上,可以尝试使用随机数来将数据均匀分布到不同的Reducer中。 6. 使用拆分JOIN操作:将一个大的JOIN操作拆分为多个较小的JOIN操作,可以减少数据倾斜的影响。 以上是一些常用的处理Hive中数据倾斜问题的方法,具体的选择取决于数据的特点和实际情况。在实践中,可能需要尝试多种方法来找到最适合的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值