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)
}
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值