Hive 表有多种存储格式,TextFile、ORC、RCFile等等。

TextFile 的存储格式是未经压缩的纯文本格式,按指定分隔符对字段进行划分。当数据本身包含了分隔符,就会导致数据错位问题,所以使用TextFile存储数据有较大的 安全隐患

如果表本身的存储格式已经是TextFile,想要转换成其他格式该如何操作?

本教程适合于Hive分区表,如果Hive表不是分区表,直接修改存储格式会导致数据读取失败!

一、查看表格式

通过建表语句,查看表本身的存储格式

命令如下:

SHOW CREATE TABLE <表名>

执行命令后会得到以下结果:

-- 返回结果有裁剪
CREATE EXTERNAL TABLE `xxx`(
  `name` bigint COMMENT '名字')
PARTITIONED BY ( 
  `xxx` xxx)
ROW FORMAT SERDE 
  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
STORED AS INPUTFORMAT 
  'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'

INPUTFORMAT、OUTPUTFORMAT 决定了表数据的读写方式,也直接决定了表的存储格式

存储格式参照表

Hive表的存储格式可以通过下表判断

OUTPUTFORMAT存储格式
org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormatTextFile
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormatTextFile
org.apache.hadoop.hive.ql.io.orc.OrcOutputFormatOrc
org.apache.hadoop.hive.ql.io.RCFileOutputFormatRCFile
org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormatParquet
org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormatSequence

二、修改表存储格式

接下来的教程是修改Hive分区表的存储格式

先介绍Hive Meta中存储格式的一些概念

表存储格式 & 分区存储格式

Hive Meta 中,TBLS 是表的元数据,其中记录了表的存储格式,PARTITIONS 是分区的元数据,也记录了分区的存储格式

表存储格式分区存储格式 究竟是什么关系?存储格式又是由哪一个决定的呢?

表存储格式 表明了Hive表的存储格式,新增的分区将跟随表的存储格式,即

新增分区的存储格式 = 表存储格式

分区存储格式:决定了该分区数据的实际存储格式

如果 db_name.tbl_name_1 一开始是 TextFile,并且新增了两个分区:part_1、part_2。那么 part_1 & part_2 这两个分区的存储格式都是 TextFile

后边我们修改了表存储格式,将其改成 ORC,并且新增了一个分区 part_3,那么 part_3 的存储格式为 ORC

此时表存储格式为 ORC,三个分区的存储格式如下表

分区名存储格式
part_1TextFile
part_2TextFile
part_3ORC

由此可见,即使是同一个分区表中的分区,其存储格式不一定全都一样

Hive & Spark 读取Hive表分区数据的差异

Hive读取分区数据,是依据分区实际存储格式来进行读写的。上个例子中:

  • 读取 part_3 将采用 ORC
  • 读取 part_1/part_2 将采用 TextFile
  • 新增 part_4 将是 ORC
  • 覆写/追加 part_2(INSERT OVERWRITE/INTO TABLE),part_2 的存储格式将会变成 ORC

Spark为了减少对 Hive Meta 的读取,默认表存储格式即分区存储格式。但Spark读取 part_1 时,将采用 ORC 的方式读取,然后会读取失败(part_1的数据实际上还是 TextFile)

三、修改表存储格式

ALTER TABLE <表名> SET FILEFORMAT <新格式,比如ORC>

修改表存储格式后:

  • 新增分区的存储格式为更新后的存储格式
  • 历史分区的存储格式仍为旧格式
    • Hive引擎可读历史分区
    • Spark引擎读取历史分区会报错(原因见上文)

四、重刷历史分区数据

重刷历史分区数据,将历史分区的存储格式修改成表最新存储格式

-- 必须使用 Hive 引擎进行数据重刷
INSERT OVERWRITE TABLE <表名> PARTITION(分区表达式)
SELECT
FROM <表名>
WHERE 分区表达式
                    Hive 表有多种存储格式,TextFile、ORC、RCFile等等。TextFile 的存储格式是未经压缩的纯文本格式,按指定分隔符对字段进行划分。当数据本身包含了分隔符,就会导致数据错位问题,所以使用TextFile存储数据有较大的安全隐患如果表本身的存储格式已经是TextFile,想要转换成其他格式该如何操作?本教程适合于Hive分区表,如果Hive表不是分区表,直接修改存储格式会导致数据读取失败!一、查看表格式通过建表语句,查看表本身的存储格式命令如下:SHOW CREATE T
TextFile文件不支持块压缩,默认格式,数据不做压缩,磁盘开销大,数据解析开销大。这边不做深入介绍。
2、RCFile
Record Columnar的缩写。是Hadoop中第一个列文件格式。能够很好的压缩和快速的查询性能,但是不支持模式演进。通常
写操作比较慢,比非列形式的文件格式需要更多的内存空间和计算量。
RCFile是一种行列存储相结合的存储方式。首先,其将数据按行分块,保证同一个record在一个块
				
要把关系型数据库应用迁移到Hadoop上,你该何去何从?本书介绍了Apache Hive,它是基于Hadoop的数据仓库架构。通过本书,读者可以很快学会如何使用Hive的SQL方言——HiveQL来汇总、查询和分析存储Hadoop分布式文件系统上的大型数据集。 本书以实际案例为主线,详细介绍如何在用户环境下安装和配置Hive,并对Hadoop和MapReduce的各项技术进行概要介绍,同时演示HiveHadoop生态系统中是如何工作的。在本书中,读者还可以看到众多的实际使用场景,包括企业如何使用Hive解决了涉及PB级数据的问题。 · 使用Hive创建、修改和删除数据库、、视图、函数和索引。 · 从文件到外部数据库,自定义数据存储格式存储选项。 · 将数据载入中以及从中抽取数据,并使用查询、分组、过滤、连接和其他常规查询方法。 · 获得创建用户自定义函数(UDF)的最佳方法。 · 了解应该使用的Hive模式以及应该避免的反模式。 · 将Hive和其他数据处理程序进行整合。 · 对于NoSQL数据库和其他数据存储使用存储控制器。 · 学习在亚马逊弹性MapReduce上执行Hive的正反两方面信息。
Java中存储数据(变量、对象、数组、集合),数据都是保存在内存中,属于瞬时状态数据 文件(File)存储数据,保存在硬盘上,属于持久化状态存储 1.2 以上存储方式存在哪些缺点? 程序停止,数据就没了。 文件存储的数据:没有数据类型的区分 没有访问安全限制 没有备份、恢复机制。 二、 数据库 2.1 概念 数据库是 "按照数据结构来组织、存储、管理数据的仓库"。是一个可以长期存储在计算机内的、有组织的、有共享的、可以统一管理的数据集合 【bigint】 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。 【int】 从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字)。存储大小为 4 个字节。int 的 SQL-92 同义字为 integer。
一、parquet格式的数据 parquet是一种列式存储格式的文件类型。存储时可以通过牛X的压缩算法节省存储空间,读取数据时只需要读取所需的列,提高读取性能。 二、JSON格式的数据 三、通过JDBC读取数据库中的数据 四、Hive中的数据 所需的pom依赖如下: <dependencies> <!-- spark核心包 --> <dependency&gt...
17.Hive中HQL的基本语法(一) 18.Hive中HQL的基本语法(二) 19.Hive中order by、sort by、distribute by与cluster by的使用 20.Hive中分析函数与窗口函数 21.Hive中UDF的介绍 22.Hive中使用自定义UDF实现日期格式转换 23. HiveServer2的介绍及三种连接方式 24.Hive元数据、fetch task和严格模式的介绍 第3章:Sqoop Sqoop及用户行为分析案例 25.CDH版本框架的介绍 26. CDH版本框架的环境部署 27.Sqoop的介绍及其实现原理 28.Sqoop的安装部署及连接测试 29.Sqoop将MySQL数据导入到HDFS(一) 30.Sqoop将MySQL数据导入到HDFS(二) 31.Sqoop中的增量导入与Sqoop job 32.Sqoop将MySQL数据导入Hive中 33.Sqoop的导出及脚本中使用的方式 34.案例分析-动态分区的实现 35.案例分析-源的分区加载创建 36.案例分析-指标分析使用Sqoop导出 第4章:Hive复杂用户行为案例分析及优化 37.自动批量加载数据到hive 38.Hive批量加载数据的脚本实现(一) 39.Hive批量加载数据的脚本实现(二) 40.HIve中的case when、cast及unix_timestamp的使用 41.复杂日志分析-需求分析 42.复杂日志分析-需求字段讲解及过滤 43.复杂日志分析-字段提取及临时的创建 44.复杂日志分析-指标结果的分析实现 45.Hive中数据文件的存储格式介绍及对比 46.常见的压缩格式及MapReduce的压缩介绍 47.Hadoop中编译配置Snappy压缩 48.HadoopHive配置支持snappy压缩 49.Hive中的常见调优 50.Hive中的数据倾斜及解决方案-三种join方式 51.Hive中的数据倾斜及解决方案-group by 52.Hive中使用正则加载数据 53. Hive中使用Python脚本进行预处理 第5章:Zeus任务资源调度工具 54.资源任务调度框架介绍 55.企业中常见的任务调度框架 56.Zeus的介绍及基本实现原理 57.Zeus安装部署-基本环境配置 58.Zeus安装部署-配置文件的修改 59.Zeus安装部署-编译打包 60.Zeus平台的调度使用 61.Zeus平台实现任务调度应用(一) 62.Zeus平台实现任务调度应用(二) 63.Zeus平台实现任务调度应用(三)
好的,你是想知道如何在Spark中整合Hive吗?Spark可以与Hive集成,这意味着可以在Spark应用程序中使用Hive数据仓库中的格。这样,你就可以使用Spark SQL API查询和处理Hive格中的数据。 以下是在Spark中整合Hive的步骤: 1. 确保在Spark中启用了Hive支持。你可以通过在SparkSession中设置`enableHiveSupport()`选项来启用Hive支持。 ```scala val spark = SparkSession.builder() .appName("Hive example") .enableHiveSupport() .getOrCreate() 2. 将Hive相关的JAR文件添加到Spark应用程序的classpath中。这些JAR文件通常位于Hive安装目录的lib文件夹中。 ```scala spark.sparkContext.addJar("/path/to/hive/lib/hive-exec.jar") spark.sparkContext.addJar("/path/to/hive/lib/hive-metastore.jar") 3. 在Hive中创建格,并将其加载到Hive数据仓库中。 4. 在Spark应用程序中使用Spark SQL API查询Hive格。 例如,以下是一个在Spark中查询Hive格的示例代码片段: ```scala val df = spark.sql("SELECT * FROM my_table") df.show() 在代码中,我们使用`spark.sql()`方法查询Hive格。Spark会自动将查询转换为HiveQL,并将其发送到Hive数据仓库执行。查询结果将返回到Spark应用程序中,可以将其加载到DataFrame中并使用`show()`方法显示。