概述
一、数据内容
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、先将文件 put
到 HDFS
指定的目录下(若是分区表,要 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
不带分区目录。
六、附:使用 Spark
将 txt
文件转为 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格式存储文件所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复