存在Hadoop集群上的文件,大部分都会经过压缩,如果是压缩后的文件,我们直接在应用程序中如何读取里面的数据?答案是肯定的,但是比普通的文本读取要稍微复杂一点,需要使用到Hadoop的压缩工具类支持,比如处理gz,snappy,lzo,bz压缩的,前提是首先我们的Hadoop集群得支持上面提到的各种压缩文件。
本次就给出一个读取gz压缩文件的例子核心代码:
压缩和解压模块用的工具包是apache-commons下面的类:
import org.apache.commons.io.IOUtils
import org.apache.commons.lang.StringUtils
如果想在Windows上调试,可以直接设置HDFS的地址即可
- val conf = new Configuration()//获取hadoop的conf
conf.set("fs.defaultFS","hdfs://192.168.10.14:8020/")//windows上调试用
至此数据已经解压并读取完毕,其实并不是很复杂,用java代码和上面的代码也差不多类似,如果直接用原生的api读取会稍微复杂,但如果我们使用Hive,Spark框架的时候,框架内部会自动帮我们完成压缩文件的读取或者写入,对用户透明,当然底层也是封装了不同压缩格式的读取和写入代码,这样以来使用者将会方便许多。
参考文章:
https://blog.matthewrathbone.com/2013/12/28/reading-data-from-hdfs-even-if-it-is-compressed