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。

阅读更多
上一篇机器学习中,数据分布不平衡的处理方法
下一篇Spark性能优化指南——高级篇
想对作者说点什么? 我来说一句

hive学习资料大全

2017年09月07日 1.16MB 下载

Hive 学习资料

2011年11月25日 1.83MB 下载

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

关闭
关闭