parquet常用操作
网上有第二种创建方法:
***种是hive0.13之后的版本,第二种时0.13之前的版本。目前大都是使用***种创建方法。
注意:
1)有SNAPPY和GZIP两种压缩算法,GZIP不管时从空间大小还是查询性能都比较优秀。
2)指定orc压缩格式是:TBLPROPERTIES('orc.compress'='ZLIB');parquet是TBLPROPERTIES('parquet.compression'='SNAPPY');
Hadoop Streaming限制:
1)Hadoop Streaming读写的数据格式都是Text文件格式。针对于parquet文件格式,无法直接读取,需要经过转换器转换。
2)Hadoop Streaming读写的api全是旧API,即mapred包。无法处理新API,mapreduce包。
MR新旧API读写parquet的例子可在 中找到。
可通过网友写的一个库直接用Hadoop Streaming读写parquet
举例:
注意事项:
通过spark,mapreduce读写parquet的方式可参考文章:
写parquet文件遇到的问题
df.write.format("parquet").mode(SaveMode.Overwrite).save(outputPath)
一、操作系统不允许非法字符包含在文件目录名中(这里的outputPath),所以在命名前需要将特殊字符过滤:
将不属于a-z,A-Z,0-9的字符去掉。
val pattern = sc.broadcast(Pattern.compile("[^a-zA-Z0-9]"))
val matcher = pattern.value.matcher(element(1)).replaceAll("").toLowerCase()
从而element(1)过滤掉非法字符后,用matcher替代即可。
二、目录的名称限制为255个字符,由于服务器这里没有权限改hdfs设置,所以只能在写入前,将目录截取为255。
三、parquet写文件时,列不区分大小写,从而可能会出现重复列的错误
例如reference "teacher" is ambiguous。
意思是teacher列出现了重复,但其实在dataframe中有一个teacher列和一个Teacher列。
这样只能修改列的名称,使它们不区分大小写也不一样。
parquet(2)读写
1、大多数情况下,我们会使用高级工具来处理parquet文件,比如hive spark impala,不过有时候我们也需要进行低级顺序访问
2、parquet具有一个可插入式的内存数据模型,其作用是要让parquet文件格式更好地与类型广泛的各种工具集成,在java中,这种集成体现在readSupport 和 WriteSupport上
3、parquet写入
3.1、创建(MessageType)schema
3.2、创建parquet message实例 Group group
3.3、创建Groupwritersupport
3.4、创建parquetWriter
3.5、调用parquetwriter的write方法,最后closewriter
4、parquet读文件,更简单,不需要设置文件属性
4.1、创建groupreadsupport
4.2、创建parquetreader
4.3、调用read方法
5、大多数程序更倾向于使用avro、protocol buffers 或者thrift这样的框架来定义数据模型,parquet则迎合了这些需求
6、如avroparquetwriter protoparquetwriter thriftparquetwriter以及其分别对应的writer
上回话周朝东迁洛阳,此回话春秋时代
周王朝所属的每一个封国,都有自己完整的本国史,但是只有鲁国的留传下来,鲁国史称为“春秋”,所以史学家把公元前722年到公元前481年称为春秋时代。
卫国首先于719年政变,政变失败,接下来鲁国政变,宋国政变
宋国国君子与夷跟他的国防总司令孔父嘉是好朋友,孔父嘉的妻子十分美丽,大臣华督见了,立刻神魂颠倒,但是她的身份高贵,华督不能直接抢夺。那时,子与夷堂弟子冯流亡郑国,华督派人跟他联络,恰好孔父嘉积极训练军队准备出猎,华督散步谣言,“孔父嘉每次都被郑国打败”,煽动士兵,士兵祈求华督伸手援救,华督就率领他们攻杀孔父嘉,顺便把子与夷也杀了,子冯到了国君位置,华督得到了孔父嘉的妻子。
因为妻子过于漂亮引来杀身之祸的,孔父嘉是历史上***人,但是因为美女而引起政权转移,王朝瓦解国家覆灭的却在以后经常出现。
行式存储和列式存储优缺点和paruqet文件结构
列式存储和行式存储是针对数据在存储介质中的排序形式而言的,假设存在一张table,那么:
图1-1所示为行式存储和列式存储的示意图,一张table包含5个字段(列)即rowid、date/time、customer name以及quantity,共7行,图中的红色箭头表示存储顺序。
存储形式的差异决定了适用场景的不同:
综合来看,列式存储比较适合大数据量(压缩比高)、分析型操作(针对少数几列);不适合频率较高的删除(全列检索)、更新(重新压缩)操作 。
图2-1所示为列式存储中将某张table基于字典表进行编码压缩的示例,图中左边为源表,假设该table中的customers和material字段的取值均只有右上表所示的5种,那么当源表的行数很大时,customers和material字段就会存在大量重复的取值,为了节省存储空间对这两个字段进行编码,即使用一个字典表(右上图)记录该两个字段的distinct取值,又下表则用右上表字段取值对应的index(整数1、2、3、4、5)来代替原来的string,由于string占用的存储空间比这几个index占用的存储空间大多了,因此可以较大程度上压缩占用的存储空间。
基于列式存储的两个典型实现是:hbase和parquet,其中:
parquet的文件结构如图3-1所示:
从图中可以看出,1个parquet文件由header(1个)、block(可以多个)、footer(1个)组成,分别负责:
图3-2所示为parquet文件中,block、rowgroup、columnchunk以及page的关系:
简而言之:
因此如果将一个parquet文件类比成一张大excel 表,那么:
hive存储parquet表
parquet格式的表在生产环境中经常被使用到,具有列式存储和压缩等特点,我们怎么在hive中存储parquet格式的表呢。
这里使用oracle的emp表
加载本地数据到hive表
执行查询
发现报错
emp使用parquet格式存储,其中imputFormat和outputFormat都是parquet的相关的,也就是我的imputFormat是parquent的,但是你传过来的是text,我不认识
我们看一下emp的相关信息,可以看到这里的都是parquet的format的,这是导致这次错误的原因。
这就导致了我们需要每次都先把text文件转化为parquet的文件,然后parquent表进行加载才可以,下面介绍官方推荐的使用方法。
查看emp_tmp的表的信息,这里可以看到,默认的是TextImputFormat和TextOutputFormat的。
然后加载数据到emp_tmp,查看数据,是正常显示的
然后现在把之前的emp里面的数据给删除
然后把emp_tmp表里面的数据加载到emp
查询一下,数据正常显示,这个方式使用起来还行,就是每次都需要对临时表进行操作,还是比较麻烦的。
感觉这个问题是经常出现,为什么会这样呢。这个和hive的版本有一定的关系。
可以看出hive官方将inputformat和outputformat进行了整合,这样使用起来也是比较方便的。
但是可能有人想,那我修改inputformat不就行了,下面我介绍一下,看是否可以
创建emp2表,是parquet的存储格式的
修改inputformat 和serde,这里inputFormat是TextInputFormat,SEDE使用的是LazySimpleSerDe,Outputformat任然是Parquet的,这里需要带上。
查看emp2表的信息,如下图表示修改成功
加载数据到emp2
查询数据,执行成功
到这里,修改inputformat和serde的方法也介绍完成了,我们以为成功了,但是上hdfs上一看,文件还是txt格式的,所以通过修改inputformat和serde的方法不行。
肯定有人想使用这个方法
这个方法我也尝试了,但是返回的值全都是null
在仅仅使用hive的时候,如果想把txt文件里面的数据保存到parquet表里面的话,可以使用建立临时表的方法,这个方法也是比较好操作的。
但是其实如果使用spark,flink等分布式计算引擎的话,是可以直接的读取txt数据保存到parquet表里面的,框架帮我们做了转化。这种方式也是我们在工作中经常使用的。
上面也介绍了修改inputformat和ser的方式,秀给inputformat是可以让txt文件里面的数据被读进来的,如果同时还修改了serde为lazysimpleserde的话,这个是把数据保存为text格式的,已经完全和parquet没有关系了,保存的文件还是txt格式的。仅修改inputformat,但是使用的serde是parquet的,但是数据进出不一致,也是有问题的。
关于parquet和parquet文件怎么打开的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。