总感觉hive与parquet和json有点关系,但又说不明白
感觉hive应该算是一种数据库,parquet和json是两种存储格式
hive是建立在hadoop上的数据仓库,列式数据库
可以通过HQL查询hive表上的数据,但不能进行交互式查询
HQL是一种类SQL语言,能将其转为Map/Reduce
适合大量数据
数据存储
对于一个表app,它在HDFS中的路径为:/warehouse/app , 其中wh实在hive-site.xml中指定的数据仓库的目录,所有的Table(不包括External Table)都保存在这个目录
Partition对应数据库中的Partition列的密集索引,所有的数据都存储在对应的目录中。例如包含dt和city两个Partition,其中dt=20190101,city=US,则HDFS目录为/warehouse/app/dt=20190101/city=US
Buckets对指定列计算hash,根据hash值切分数据,每个Bucket对应一个文件。将user列分散至32个bucket,对应hash值为20的HDFS目录为:/warehouse/app/dt=20190101/city=US/part-00020
parquet是列式存储
每个字段分为几种属性
required (出现1次
repeated(出现多次
optional (0或1次
每个字段可以分为基本类型,或者复杂类型group
基本类型有
INT64,INT32,BOOLEAN,BINARY,FLOAT,DOUBLE,INT96,FIX_LEN_BYTE_ARRAY
当写一个Parquet文件时,必须按照上面来构建一个schema对应的message字符串
MessageType schema=MessageTypeParser.parseMessageType(message)
最终的parquet文件可以与hive数据库相关联,支持hive sql查询
create table tableName(key string,value string) stored as parquet //创建表
alter table tableName add if not exists partition(date="2019") location hdfs://.... //与parquet文件关联
json
能把数据结构转换为string(里面保存了key,value长度,类型等等)
读取json的方式
val fileStream = fs.open(path) val fileBuffer = new Array[Byte](fileStream.available()) fileStream.readFully(fileBuffer) parse(new String(fileBuffer)).extract[Map[String,List[String]]]