Hive学习资料

Hive中内部表和外部表的区别:

Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。这样外部表相对来说更加安全些,数据组织也更加灵活,方便共享源数据。默认创建的是内部表,加入external关键词则为创建外部表。

 

时期数和时点数的区别:

时期数是一段时间内的统计,指的是某种现象在一段时间内的总量。通常来说,时期数是可以累加的,从而得到更长时间内的时期数。比如:某种产品的产量、职工工资总额、商品销售额、投资总额等;

时点数是事物在某一时间点上的数量统计,把同一时间点上的数量累积,例如,可以把1-3月各月商品销售额相加,相加之后便得到1季度的商品销售额。时点数具有不可加性,也就是说在一般情况下不能把不同时点的指标数值相加,因为加总后的数值没有实际的意义。例如,不能把一年12个月的月末人口数相加,相加后的结果是没有实际意义的,时点数的大小与时点间隔的长短没有关系。例如,人口数、商品库存量、固定资产价值、设备台数等都是时点数。

判断时期数和时点数的方法就是看指标是否具有可加性

如果对hive特殊字符进行转义处理,要用两个\,即'\\':

究其原因可能是有些特殊字符hive需要转义,翻译成hadoop后,hadoop也认为这是一个特殊字符,所以需要再转一次义才能正常工作。

举例来说,如下语句:

Select split(tmp(data),’\\(’)[0] name from tmp.tmp_test

这条语句就是对于tmp(data)取出tmp的值,以(作为切分。

Hive表格在创建表指定分隔符时,不支持多个字符作为分隔符

hive中create table时指定列分隔符,只能用一个字符,解决办法:

1.可以将源文件中的分隔符替换为一个字符,比如\001(ctrl+A),创建表时指定\001作为分隔符;

2.自定义outputformat和inputformat

Hive 的 outputformat/inputformat 与 hadoop 的 outputformat/inputformat 相当类似,inputformat 负责把输入数据进行格式化,然后提供给 Hive , outputformat 负责把 Hive 输出的数据重新格式化成目标格式再输出到文件,这种对格式进行定制的方式较为底层,对其进行定制也相对简单,重写 InputFormat 中 RecordReader 类中的 next 方法即可。

(下例中,文件用^^作为切分符,两个字符,然后针对源文件进行修改)

示例代码如下:

Java代码  

  1. public boolean next(LongWritable key, BytesWritable value) throws IOException {  
  2.         while (reader.next(key,text)) {  
  3.             String strReplace = text .toString().toLowerCase().replace( "^^" , "\001" );  
  4.             Text txtReplace = new Text();  
  5.             txtReplace.set(strReplace );  
  6.             value.set(txtReplace.getBytes(), 0, txtReplace.getLength());  
  7.             return true ;  
  8.         }  
  9.       return false ;  

10. }  

 重写 Hive IgnoreKeyTextOutputFormat 中 RecordWriter 中的 write 方法,示例代码如下:

Java代码  

  1. public void write (Writable w) throws IOException {  
  2.       String strReplace = ((Text)w).toString().replace( "\001" , "^^" );  
  3.       Text txtReplace = new Text();  
  4.       txtReplace.set(strReplace);  
  5.       byte [] output = txtReplace.getBytes();  
  6.       bytesWritable .set(output, 0, output. length );  
  7.       writer .write( bytesWritable );  
  8. }  

 

Hive不支持非等值连接

Hive受限于Map-reduce模型,只支持equi-join(等值连接),

 

hive中order by,sort by, distribute by, cluster by作用以及用法

1. order by

    Hive中的order by跟传统的sql语言中的order by作用是一样的,会对查询的结果做一次全局排序,所以说,只有hive的sql中制定了order by所有的数据都会到同一个reducer进行处理(不管有多少map,也不管文件有多少的block只会启动一个reducer)。但是对于大量数据这将会消耗很长的时间去执行。

    这里跟传统的sql还有一点区别:如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

2. sort by

Hive中指定了sort by,那么在每个reducer端都会做排序,也就是说保证了局部有序(每个reducer出来的数据是有序的,但是不能保证所有的数据是有序的,除非只有一个reducer),好处是:执行了局部排序之后可以为接下去的全局排序提高不少的效率(其实就是做一次归并排序就可以做到全局排序了)。

3. distribute by和sort by一起使用

ditribute by是控制map的输出在reducer是如何划分的,这里需要注意的是distribute by必须要写在sort by之前。

4. cluster by

    cluster by的功能就是distribute by和sort by相结合,注意被cluster by指定的列只能是降序,不能指定asc和desc。

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页