在上一篇文章中,我们讨论了Spark的大数据,并告诉你如何在阿里云上设置它。
在本博客系列中,我们将引导您介绍 Hive 的基础知识,包括大数据应用程序的表创建和其他基本概念。
詹妮弗·帕尔卡说:”我们利用数据做大事的能力将真正改变我们生活的方方面面。
执行 MapReduce 操作的方法不同。首先是传统方法,我们使用 Java MapReduce 程序处理所有类型的数据。第二种方法是 MapReduce 处理结构化和半结构化数据的脚本方法。此方法是通过使用 Pig 实现的。然后是 Hive 查询语言、HiveQL 或 HQL,用于 MapReduce 来处理结构化数据。这是由蜂巢实现的。
蜂巢案例
如我们上一篇文章所述,Hadoop 是一系列工具和技术,此时部署 Hive 和 Pig 更加方便。蜂巢比 Pig 有其优势,特别是因为它可以通过仓储使数据报告和分析更容易。
Hive 构建在 Hadoop 之上,用于查询和分析存储在 HDFS 中的数据。它是一种工具,可帮助程序员分析大型数据集,并在称为 HiveQL 的查询语言的帮助下轻松访问数据。此语言在内部将类似 SQL 的查询转换为 MapReduce 作业,以便将其部署到 Hadoop 上。
在这个立场上,我们也有Impala,这和Hive一起是很经常听到的,但是如果你仔细观察,Hive在市场有它自己的空间,因此它也有更好的支持。Impala 也是一个基于 Hadoop 之上的查询引擎。它利用现有的 Hive,因为许多 Hadoop 用户已经具备了执行面向批处理的作业的位置。
Impala 的主要目标是通过 SQL 实现快速高效的操作。将 Hive 与 Impala 集成为用户提供了使用 Hive 或 Impala 进行处理或创建表的优势。Impala 使用一种称为 ImpalaQL 的语言,它是 HiveQL 的子集。在本文中,我们将重点介绍 Hive。
蜂巢的特点
- Hive 设计用于仅管理和查询结构化数据
- 在处理这些结构化数据时,Map Reduce 没有 U0F 等优化功能,但 Hive 框架可以帮助您更好地进行优化
- 使用 Hive 而不是 Java,可以减少 Map 减少编程的复杂性。因此,这些概念类似于 SQL。
- Hive 使用分区来提高某些查询的性能。
- Hive 的一个重要组件是驻留在关系数据库中的 Metastore
通过借用”一次写入多次(WORM)”的概念,Hive的设计基于”只读时模式”。典型的 Hive 查询在多个数据节点上运行,因此很难跨多个节点更新和修改数据。但是,这在最新版本的Hive中已经解决了。
文件格式
Hive 支持各种文件格式,如平面文件或文本文件、序列文件、RC 和 ORC 文件、Avro 文件、Parquet 以及自定义输入和输出格式。文本文件是 Hive 的默认文件格式。
蜂巢中的存储选项
- Metastore:Metastore 是一个主要组件,它跟踪数据库、表、数据类型等的所有元数据。
- 表:Hive 中有两种不同类型的表可用。它们是普通表和外部表。两者都类似于数据库中的公用表,但”EXTERNAL”一词允许您创建表并提供位置,以便 Hive 不使用默认位置。另一个区别是,当删除外部表时,您仍然将数据驻留在 HDFS 中。另一方面,在删除表时,将删除普通表中的数据。
- 分区:分区是切片表,这些表存储在表目录中的不同子目录中。这有助于提高查询性能,尤其是在选择带有”WHERE”子句的语句的情况下。
- 存储桶:存储桶是哈希分区,它们有助于加快数据联接和采样的速度。要在 Hive 中实现此存储桶概念,请使用按命令群集,同时创建表。每个存储桶将存储为表目录下的文件。在创建表时,修复存储桶数。根据哈希值,数据将分布在各个存储桶中。
蜂巢塞尔德
Hive 或 Hive SerDe 中的序列化器/去序列化器用于 IO,它可以处理蜂巢中的序列化和反序列化。有不同类型的 SerDe,如本机 SerDe 和自定义 SerDe,您可以使用它们创建表。如果未指定 ROW FORMAT,则使用本机 SerDe。除了不同类型的SerDe,我们还可以为我们自己的数据格式编写我们自己的SerDe。在此初始阶段,我们将熟悉这个概念,因为在 Hive 中集中注意力很重要。
为了回忆一下,无论您写入 HDFS 的任何文件,它都存储为那边的文件。蜂巢来了,它可以将结构强加在不同的数据格式上。下面阐述的关于启动蜂巢外壳、其用法以及一些基本查询,以便从和了解 Hive 的工作情况入手。
启动蜂巢外壳
登录到阿里云主弹性组合服务(ECS) 实例,只需键入”配置”,从而导致屏幕如下所示。如果将 Hive 配置为在不同的辅助节点而不是主节点上运行,则登录到该特定主机并打开配置单元外壳png”数据-新=”假”数据大小=”140346″数据大小格式化”140.3 kB”数据类型=”temp”数据 url=”/存储/临时/13010894-屏幕-屏幕-2020-02-04-10212 5-am.png”src=”http://www.cheeli.com.cn/wp-内容/上传/2020/02/13010894-屏幕拍摄-2020-02-04-在102125-am.m.png”样式=”宽度:655px;显示:块;垂直对齐:顶部;边距:5px自动;文本对齐:中心;”/>
让我们看一下 HiveQL 中的一些基本查询。第一个是创建一个在Hive的表。
语法
创建表不存在* table_name
.)]
[评论table_comment]
[行格式row_format]
File_format]
输出
xxxxxxxxxx
2222px;”>
还行
5,905秒
在我们的例子中,让我们尝试创建一个表,其中列位于tripadvisor_merged表中。
xxxxxxxxxx
6667px;”>
创建表tripadvisor_museum_USonly (Sno字符串地址字符串描述字符串费字符串经度字符串纬度字符串访问长度访问字符串博物馆名称字符串Phonenum字符串排名字符串分级浮动审查计数字符串TotalThingsToDo字符串国家字符串国家字符串Rank百分比字符串Art_Galleries字符串Art_Museums字符串Auto_Race_Tracks字符串,Families_Count字符串Couple_Count字符串Solo_Count字符串,
Friends_Count字符串)
比佐.hive.serde.csv.CSVSerde’
与塞尔德属性(
"分离器"=",",
"报价查尔" ="\"")
存储为文本文件
tbl属性("跳过.header.line.count"="1");
cheeli.com.cn/wp-content/uploads/2020/02/13010897-screen-shot-2020-02-04-at-102313-am.png”样式=”宽度:747px;显示:块;垂直对齐:顶部;边距:5px自动;文本对齐:中心;”/>
对于同一情况,让我们尝试创建一个 Avro 表,因为我们一直在讨论整个博客系列中的这种文件格式,以获得最佳性能。
xxxxxxxxx
2222px;”>
创建表tripadvisor_museum_USonly_avro
ROWFORMATSERDE'org.apache.hadoop.hive.serde2.avro.AvroSerde'
存储为INPUTFORMAT'org.apache.hadoop.hive.ql.io.avro.Avro.Avro 容器输入格式'
输出"org.apache.hadoop.hive.ql.io.avro.Avro.Avro容器输出格式"
TBLPROPERTIES (
"avro.schema.literal"="\"\"
行程.avro”,
"名称""旅行顾问",
"类型""记录",
"字段": |
["名称":"sno","类型":"字符串","名称":"地址","类型":"字符串","名称":"说明","类型":"字符串"*,"名称":"功能计数","类型":"字符串","名称","""字号","""字号",""字号",""字号",""字号","字号",""字号","字号","字号","字号","字号","字号":"字符串"*,*"名称":"纬度"," 类型":"字符串""名称":"Length_of_visit"" 类型":"字符串"\""名称":"博物馆名称","类型":"字符串",\"名称":"descri_sub","键入":"字符串";"
xxxxxxxxx
插入覆盖表三脚架选择斯诺地址描述功能计数费,
经纬度长度 参观博物馆名称descri_sub从
1px;”•tripadvisor_museum_USonly;
同样,为文件中的列创建所有列并创建相应的插入语句以将数据插入到创建的表中
完成后,列出要查看的文件夹
加载数据
通常,在 SQL 中创建表后,我们使用 Insert 语句插入数据。但在 Hive 中,我们可以使用”LOAD DATA”语句插入整个数据集。
语法
xxxxxxxxx
2222px;”>
加载数据=本地INPATH"文件路径"
*覆盖到表名;
在蜂巢中使用 OSS
要将阿里云对象存储服务(OSS) 用作 Hive 中的存储,请创建一个外部表,如下所示
xxxxxxxxx
2222px;”>
创建外部表demo_table (
useridINT名称STRING)
位置'oss://demo1bucket/用户';
例如,编写一个用于创建外部表的脚本并将其另存为 hiveDemo.sql。完成后,将其上传到 OSS
xxxxxxxxx
2222px;”>
使用默认值;
设置蜂巢。输入。格式=组织。阿帕奇.哈多普.蜂巢。ql.io. .Hive输入格式;
设置蜂巢。统计。自动聚集=false;
创建外部表demo_table (
useridINT,
名称STRING)
1px;”•行格式分隔
已停止BY'\t'
存储为文本文件
位置'oss://demo1bucket/用户';
基于以下配置在 E-MapReduce 中创建新作业
xxxxxxxxx
2222px;”>
-fossref://$[bucket]/您的路径/hiveDemo.sql
在”${bucket}”中指定存储桶名称,并在”您的路径”中提及已保存配置单元脚本的位置
何时蜂巢不适合?
- 蜂巢可能不适合在线交易处理 (OLTP)
- 实时查询
- Hive 不是为行级别的更新而设计的
最佳实践
- 使用分区提高查询性能
- 如果存储桶密钥和联接键是公用的,则存储桶可帮助提高联接性能
- 选择输入格式在我们所有的文章中都扮演着关键的角色。在此方面,蜂巢也不例外。选择适当的文件格式可以使 Hive 性能更好
- 采样允许用户获取数据集的子集并进行分析,而无需处理整个数据集。Hive 提供了一个内置的 TABLESAMPLE 子句,允许对表进行采样