大数据学习(10)—— Hive进阶
2024-09-02 13:07:51
前面提到了Hive的知识点非常零散,我不知道该怎么把这些知识点分类,跟SQL关系没那么大的就放在这一篇吧。
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个桶里。可以看到,分桶表的数据也只能从其他已经存在的表获取。
最新文章
- asp.net 文件下载(txt,rar,pdf,word,excel,ppt)
- linux pxe+dhcp+nfs+tftp
- Vijos1019 补丁VS错误[最短路 状态压缩]
- POJ1185炮兵阵地(状态压缩 + dp)
- 移动Web—CSS为Retina屏幕替换更高质量的图片
- js对cookie的操作,包括增,取,删
- Android 中获取 debug 测试 SHA1 和 release SHA1 证书指纹数据的方法
- Teamwork——Week4 团队分工和预估项目时间
- Hibernate操作和保存方式
- Java跳出循环-break和continue语句
- [转]Python中的矩阵转置
- 获取ListControl控件中(复选框)CheckBox的状态
- [Hapi.js] Up and running
- 《Windows编程循序渐进》——建立MFC应用程序
- 《转载-两篇很好的文章整合》Android中自定义控件
- innobackupex: fatal error: no ‘innodb_buffer_pool_filename’解决方法
- Angular结构型指令,模块和样式
- C#将unix时间戳转换成.net的DateTime类型的代码
- Nodejs exec和spawn的区别
- Linux运维人员最常用166个命令汇总
热门文章
- NOIP模拟测试14「旋转子段·走格子·柱状图」
- Kubernetes ConfigMap详解,多种方式创建、多种方式使用
- nohup启动 jar 不输出日志
- 使用了gitlab管理pipeline,Jenkinsfile 中在出现克隆命令流水线执行会混乱
- acwing 890. 能被整除的数
- 为什么socket是三次握手挥手却是四次
- 1.3.3、通过Header属性匹配
- Centos7 yum安装 MySQL5.7.25
- Java 设置PDF跨页表格重复显示表头行
- fastposter发布1.4.2 跨语言的海报生成器