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代码
- public boolean next(LongWritable key, BytesWritable value) throws IOException {
- while (reader.next(key,text)) {
- String strReplace = text .toString().toLowerCase().replace( "^^" , "\001" );
- Text txtReplace = new Text();
- txtReplace.set(strReplace );
- value.set(txtReplace.getBytes(), 0, txtReplace.getLength());
- return true ;
- }
- return false ;
10. }
重写 Hive IgnoreKeyTextOutputFormat 中 RecordWriter 中的 write 方法,示例代码如下:
Java代码
- public void write (Writable w) throws IOException {
- String strReplace = ((Text)w).toString().replace( "\001" , "^^" );
- Text txtReplace = new Text();
- txtReplace.set(strReplace);
- byte [] output = txtReplace.getBytes();
- bytesWritable .set(output, 0, output. length );
- writer .write( bytesWritable );
- }
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。