parquet是一种列式存储。可以提供面向列的存储和查询。
Parquet的优势
在sparkSQL程序中使用parquet格式存储文件,在存储空间和查询性能方面都有很高的效率。
存储方面
因为是面向列的存储,同一列的类型相同,因而在存储的过程中可以使用更高效的压缩方案,可以节省大量的存储空间。
查询方面
在执行查询任务时,只会扫描需要的列,而不是全部,高度灵活性使查询变得非常高效。
实例测试
测试数据大小 | 存储类型 | 存储所占空间 | 查询性能 |
---|---|---|---|
1T | TEXTFILE | 897.9G | 698s |
1T | Parquet | 231.4G | 21s |
Parquet的使用
使用parquet的简单demo:
1 | // Encoders for most common types are automatically provided by importing spark.implicits._ |
Parquet 的问题
spark 写入数据到 hive 中,使用 Parquet 存储格式,查询该表时报错如下:
1 | Error: java.io.IOException: org.apache.parquet.io.ParquetDecodingException: Can not read value at 0 in block -1 in file |
当时设置的字段属性为:
经过比对,发现是 decimal 类型出了问题,查询 decimal 的字段时候就会报错,而查询其他的并不会报错。(这应该是 spark 引起的,因为在 hive 客户端执行 decimal 类型的操作时并不会出错。)
查阅网上,也有些朋友遇到了类似的事情,应该是官方的 bug ,暂时的解决办法是:
1 | 1. 将 Parquet 的存储格式转换为 ORC |