我是靠谱客的博主 执着砖头,最近开发中收集的这篇文章主要介绍Hive使用Snappy压缩,Parquet格式存储文件,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、数据内容

95002,刘晨,女,19,IS
95017,王风娟,女,18,IS
95018,王一,女,19,IS
95013,冯伟,男,21,CS
95014,王小丽,女,19,CS
95019,邢小丽,女,19,IS
95020,赵钱,男,21,IS

二、查看 HDFS 是否支持 Snappy 格式

shell 命令行执行:

hadoop checknative

返回:

21/01/26 20:32:52 WARN bzip2.Bzip2Factory: Failed to load/initialize native-bzip2 library system-native, will use pure-Java version
21/01/26 20:32:52 INFO zlib.ZlibFactory: Successfully loaded & initialized native-zlib library
Native library checking:
hadoop:
true /opt/module/hadoop-2.7.2/lib/native/libhadoop.so
zlib:
true /lib64/libz.so.1
snappy:
true /opt/module/hadoop-2.7.2/lib/native/libsnappy.so.1
lz4:
true revision:99
bzip2:
false

若是 snappy 后面是 true ,则支持 snappy 压缩。

三、方式一:使用 load 方式加载

1、建表

create table student
(id Int,
name String,
sex String,
age Int,
country String)
partitioned by(date_str String)
stored as parquet
tblproperties("parquet.compress"="SNAPPY");

2、查看表结构,是否与第一步中建的一样

desc formatted student;

3、直接加载数据

load data local inpath '/root/student.snappy.parquet' into table student partition(date_str='2021');

四、方式二:将文件先 put 到指定目录,最后 load

–hive使用snappy压缩,parquet格式存储文件(先将文件存放到HDFS的’/stu’目录下,然后再使用下面的建表语句,可以直接扫描到)
–但是分区表,扫描不到(错误意识)

1、先将文件 putHDFS 指定的目录下(若是分区表,要 put 到指定分区)

hadoop fs -out
/root/student.snappy.parquet
/stu/date_str=2020

2、建表

create external table student_snappy
(id Int,
name String,
sex String,
age Int,
country String)
partitioned by(date_str String)
stored as parquet
location '/stu'
tblproperties("parquet.compress"="SNAPPY");

3、查看表结构,是否与第二步中建的一样

desc formatted student;

4、直接加载数据

load data inpath '/stu/date_str=2020' into table student_snappy partition(date_str='2020');

五、注意事项:

1、Hive 表的字段类型与 Parquet 文件中字段的类型必须一致。否则会导致空表(但不会报错,让你不会察觉)
2、使用第二种方法的时候。若不是分区表,不用 load 加载也可以查到数据。但若是分区表,则必须使用 load 加载,否则会导致空表(但不会报错,让你不会察觉)
3、使用第二种方法建分区表的时候。建表语句 location 不带分区目录。

六、附:使用 Sparktxt 文件转为 Snappy 压缩(Spark默认压缩格式),Parquet 格式的文件

import org.apache.spark.SparkContext
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
/**
* 将txt转为parquet
*/
object Txt2Parquet {
def main(args: Array[String]): Unit = {
//待转换的文件路径
val path = "E:\data\student.txt"
val spark: SparkSession = SparkSession.builder()
.appName("Txt2Parquet")
.master("local[*]").getOrCreate()
//RDD ===> DataFrame
val sc: SparkContext = spark.sparkContext
//设置日志级别
sc.setLogLevel("WARN")
//读取txt文件
val stuRDD: RDD[String] = sc.textFile(path)
//RDD ===> DataFrame 需要隐式转换
import spark.implicits._
val stuDF: DataFrame = stuRDD.map(_.split(",", -1))
.map(line => Student(line(0).toInt, line(1), line(2), line(3).toInt, line(4))).toDF()
//写为Snappy压缩的Parquet文件。设置文件数为1
stuDF.repartition(1).write.mode(SaveMode.Overwrite).parquet("E:\data\student")
//设置压缩格式为gzip
//
stuDF.repartition(1).write.mode(SaveMode.Overwrite)
//
.option("compression","gzip").parquet("E:\data\student_gzip")
//关闭资源
spark.stop()
}
case class Student(id: Int, name: String, sex: String, age: Int, country: String)
}

最后

以上就是执着砖头为你收集整理的Hive使用Snappy压缩,Parquet格式存储文件的全部内容,希望文章能够帮你解决Hive使用Snappy压缩,Parquet格式存储文件所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部