前面提到了Hive的知识点非常零散,我不知道该怎么把这些知识点分类,跟SQL关系没那么大的就放在这一篇吧。

Hive Serde

参考Hive Serde

Serde是啥

Serde是序列化和反序列化的简称。为啥这么说?序列化是Serializer,反序列化是Deserializer,各取前几个字母一拼就成了。Hive里的序列化和反序列化干嘛用的?简单的说,就是在HDFS文件和表数据之间做转换。

  • Hive使用Serde(还有文件格式化)来读写表记录。
  • 读数据:HDFS文件->输入文件格式->键值对->反序列化->行对象。
  • 写数据:行对象->序列化->键值对->输出文件格式->HDFS文件

注意:键值对的键在读数据的时候会被忽略,在写数据的时候是个常量。基本上行对象只存储值。org.apache.hadoop.hive.serde这个类已经不推荐使用了,要使用新的org.apache.hadoop.hive.serde2。

Hive使用这些文件格式化的类来读写HDFS文件:
TextInputFormat/HiveIgnoreKeyTextOutputFormat: 读写些文本格式的文件
SequenceFileInputFormat/SequenceFileOutputFormat: 读写Hadoop SequenceFile格式的文件。SequenceFile里存储二进制的键值对。

针对不同格式的数据,Hive提供了不同的序列化/反序列化处理类(通俗地说,就是从特定格式的数据文件中提取想要的内容或者把内容写成特定格式的数据文件),详细信息请参考官网,这里不再赘述。

动态分区

静态分区必须手工给分区字段赋值,其结果是一个文件的所有数据都属于同一个分区。这不是我们想要的,我们希望能够根据文件中某个字段来将数据散列到不同的分区中。动态分区就是解决这个问题。

--动态分区语法:
INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;
INSERT INTO TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...) select_statement FROM from_statement;

从上可知,动态分区表的记录必须是从其他已经存在的表里获取的,不能直接从文件加载。

分桶

分桶有点像分区。分区是把数据文件放到不同的目录下,分桶是把数据放到同一个目录的不同的文件中。建分桶表的时候,会指定一个分桶的字段,根据桶的数量来计算散列到哪个桶里。分桶的好处是,可以更快地从不同的桶中获取抽样数据。

首先设置分桶参数
set hive.enforce.bucketing = true; CREATE TABLE user_info_bucketed(user_id BIGINT, firstname STRING, lastname STRING)
COMMENT 'A bucketed copy of user_info'
PARTITIONED BY(ds STRING)
CLUSTERED BY(user_id) INTO 256 BUCKETS; FROM user_id
INSERT OVERWRITE TABLE user_info_bucketed
PARTITION (ds='2009-02-25')
SELECT userid, firstname, lastname WHERE ds='2009-02-25';

上面的例子,根据user_id字段,把数据分散到256个桶里。可以看到,分桶表的数据也只能从其他已经存在的表获取。

最新文章

  1. asp.net 文件下载(txt,rar,pdf,word,excel,ppt)
  2. linux pxe+dhcp+nfs+tftp
  3. Vijos1019 补丁VS错误[最短路 状态压缩]
  4. POJ1185炮兵阵地(状态压缩 + dp)
  5. 移动Web—CSS为Retina屏幕替换更高质量的图片
  6. js对cookie的操作,包括增,取,删
  7. Android 中获取 debug 测试 SHA1 和 release SHA1 证书指纹数据的方法
  8. Teamwork——Week4 团队分工和预估项目时间
  9. Hibernate操作和保存方式
  10. Java跳出循环-break和continue语句
  11. [转]Python中的矩阵转置
  12. 获取ListControl控件中(复选框)CheckBox的状态
  13. [Hapi.js] Up and running
  14. 《Windows编程循序渐进》——建立MFC应用程序
  15. 《转载-两篇很好的文章整合》Android中自定义控件
  16. innobackupex: fatal error: no ‘innodb_buffer_pool_filename’解决方法
  17. Angular结构型指令,模块和样式
  18. C#将unix时间戳转换成.net的DateTime类型的代码
  19. Nodejs exec和spawn的区别
  20. Linux运维人员最常用166个命令汇总

热门文章

  1. NOIP模拟测试14「旋转子段·走格子·柱状图」
  2. Kubernetes ConfigMap详解,多种方式创建、多种方式使用
  3. nohup启动 jar 不输出日志
  4. 使用了gitlab管理pipeline,Jenkinsfile 中在出现克隆命令流水线执行会混乱
  5. acwing 890. 能被整除的数
  6. 为什么socket是三次握手挥手却是四次
  7. 1.3.3、通过Header属性匹配
  8. Centos7 yum安装 MySQL5.7.25
  9. Java 设置PDF跨页表格重复显示表头行
  10. fastposter发布1.4.2 跨语言的海报生成器