Hive ETL:加载 JSON、XML、文本数据示例

⚡ 智能摘要

Hive ETL 通过将文本、XML 和 JSON 文件加载到 Hive 中,并执行相应的操作,将它们转换为可查询的表。trac使用 xpath() 和 get_json_object() 获取值,为分析人员提供对半结构化 Hadoop 数据的 SQL 接口。

  • 🧱 结构荷载: 将分隔符文本文件转换为 ROW FORMAT DELIMITED 表,并加上 FIELDS TERMINATED BY,然后加载数据到本地 INPATH。
  • 🏷️ XML示例trac功能: 每个 XML 文档都保存在一个 STRING 列中,xpath() 函数从命名标签中提取值。
  • ???? JSON 示例trac功能: get_json_object() 每次调用读取一个 JSONPath 表达式,因此每个字段都需要单独调用一次。
  • 🪜 嵌套有效载荷: 复杂的 JSON 加载方式完全相同,层次结构通过点 JSONPath 表达式遍历。
  • 📍 路径规则: LOCAL 关键字从 Linux 文件系统读取文件,而省略该关键字则会解析 HDFS 上的路径。
  • 🎯 适用场合: Hive 更适合批量数据仓库和半结构化 ETL,而不是低延迟记录查找。

Hive ETL:加载 JSON、XML 和文本数据

Hive 作为 ETL 和数据仓库工具,构建于……之上 Hadoop的 生态系统提供数据建模、数据操作、数据处理和数据查询等功能。数据扩展trac在 Hive 中进行操作意味着在 Hive 中创建表,加载结构化和半结构化数据,以及根据需求查询数据。

对于批量处理,我们将使用脚本语言编写自定义的 Map 和 Reduce 脚本。它提供了一个 SQL 喜欢环境并支持轻松查询。

使用 Hive 处理结构化数据

结构化数据是指数据采用正确的行和列格式。这更像是…… RDBMS 具有适当行和列的数据。

接下来,我们将把文本文件中存在的结构化数据加载到 Hive 中。

步骤1) 在此步骤中,我们创建表“employees_guru”,其列名包括员工的 Id、姓名、年龄、地址、薪水和部门以及数据类型。

在 Hive 中创建 employees_guru 表并加载 Employees.txt 文件。

从上面的截图中,我们可以看到以下内容:

  1. 创建表“employees_guru”
  2. 将 Employees.txt 中的数据加载到表“employees_guru”中

步骤2) 在此步骤中,我们将使用“SELECT”命令显示此表中存储的内容。您可以在下面的屏幕截图中看到表的内容。

选择查询输出,显示 employees_guru Hive 表的行

示例代码片段

要执行的查询

1) Create table employees_guru(Id INT, Name STRING, Age INT, Address STRING, Salary FLOAT, Department STRING)
> Row format delimited
> Fields terminated by ',';
2) load data local inpath '/home/hduser/Employees.txt' into TABLE employees_guru;
3) select * from employees_guru;

使用 Hive 处理半结构化数据(XML、JSON)

Hive 在 Hadoop 生态系统中执行 ETL 功能,它充当…… ETL工具在某些类型的应用程序中执行 MapReduce 可能很困难;Hive 可以降低这种复杂性,并为数据仓库领域的 IT 应用程序提供最佳解决方案。

使用 Hive 可以更轻松地处理 XML 和 JSON 等半结构化数据。首先,我们将了解如何使用 Hive 来处理这些数据。 XML.

XML 转 Hive 表

在此,我们将把 XML 数据加载到 Hive 表中,并获取存储在 XML 标签内的值。

步骤1) 创建名为“xmlsample_guru”的表,其中包含一个名为str的字符串数据类型的列。

创建 xmlsample_guru 表并将 test.xml 加载到 Hive 中

从上面的截图中,我们可以看到以下内容:

  1. 创建表“xmlsample_guru”
  2. 将 test.xml 中的数据加载到表“xmlsample_guru”中

步骤2) 使用 XPath的 通过 xpath() 方法,我们将能够获取存储在 XML 标签内的数据。

使用 xpath() 查询从 XML 列返回 ename 和 esal 值

从上面的截图中,我们可以看到以下内容:

  1. 我们使用 xpath() 方法获取存储在 /emp/esal/ 和 /emp/ename/ 目录下的值。
  2. XML 标签内的值。在此步骤中,我们将显示存储在表“xmlsample_guru”中 XML 标签下的实际值。

请注意,xpath() 返回一个字符串数组;xpath_string()、xpath_int() 和 xpath_double() 返回一个类型化的值。

步骤3) 在此步骤中,我们将获取并显示表“xmlsample_guru”的原始 XML。

存储在 xmlsample_guru 表 str 列中的原始 XML 文档

从上面的截图中,我们可以看到以下内容:

  • 使用标签显示的实际 XML 数据
  • 如果我们观察单个标签,它的父标签是“emp”,子标签是“ename”和“esal”。

Code 片段:

要执行的查询

1) create table xmlsample_guru(str string);                                                                                                   2) load data local inpath '/home/hduser/test.xml' overwrite  into table xmlsample_guru;
3) select xpath(str,'emp/ename/text()'), xpath(str,'emp/esal/text()') from xmlsample_guru;

JSON(Java脚本对象符号)

社交媒体和网站数据通常以 JSON 格式存储。每当我们尝试从在线服务器获取数据时,都会返回 JSON 文件。使用 Hive 作为数据存储,我们可以通过创建模式将 JSON 数据加载到 Hive 表中。

JSON 转 Hive 表

在此过程中,我们将把 JSON 数据加载到 Hive 表中,并获取存储在 JSON 模式中的值。

步骤1) 在此步骤中,我们将创建一个名为“json_guru”的JSON表。创建完成后,我们将加载并显示实际模式的内容。

创建 json_guru 对象,加载 test.json 文件并显示 JSON 模式

从上面的截图中,我们可以看到以下内容:

  1. 创建表“json_guru”
  2. 将 test.json 中的数据加载到表“json_guru”中
  3. 显示存储在 json_guru 表中的 JSON 文件的实际架构

步骤2) 使用 get_json_object() 方法,我们可以获取存储在 JSON 层次结构中的数据值。

get_json_object() 函数会输出 json_guru 中的 ecode、ename 和 salary 字段。

从上面的截图中,我们可以看到以下内容:

  1. 使用 `get_json_object(str,'$.ecode')` 可以从表 `json_guru` 中获取 ecode 值。类似地,使用 `get_json_object(str,'$.ename')` 和 `get_json_object(str,'$.sal')` 将从表 `json_guru` 中获取 ename 和 sal 值。
  2. json_guru 中 JSON 层次结构内存储的值

因为 get_json_object() 每次调用只解析一次文档,所以当需要多个键时,json_tuple() 更便宜,而 JSON SerDe 会在加载时将文档映射到类型化的列。

Code 片段

要执行的查询

1) create table json_guru(str string);
2) load data inpath 'home/hduser/test.json' into table json_guru;
3) select * from json_guru;
4) select get_json_object(str,'$.ecode') as ecode, get_json_object(str,'$.ename') as ename ,get_json_object(str,'$.sal') as salary from json_guru;

复杂的 JSON 转换为 Hive 表

在此,我们将把复杂的 JSON 数据加载到 Hive 表中,并获取存储在 JSON 模式中的值。

步骤1) 创建具有单个列字段的 complexjson_guru。

创建 complexjson_guru 并将 emp.json 加载到 Hive 表中

从上面的截图中,我们可以看到以下内容:

  1. 创建名为 complexjson_guru 的表,该表包含一个字段,数据类型为字符串。
  2. 从 emp.json 复杂 JSON 文件将数据加载到 complexjson_guru 中

步骤2) 通过使用 get_json_object,我们可以检索存储在 JSON 文件层次结构中的实际内容。

从以下截图中,我们可以看到存储在 complexjson_guru 中的数据的输出。

Extrac从复杂的 JSON 文档中提取 ecode 和嵌套键值

步骤3) 在此步骤中,通过使用“Select”命令,我们可以看到存储在表“complexjson_guru”中的复杂JSON数据。

选择输出,显示 complexjson_guru 中的原始复杂 JSON 行

示例代码片段

要执行的查询

1) create table complexjson_guru(json string);
2) load data inpath 'home/hduser/emp.json' into table complexjson_guru;
3) select get_json_object(json,'$.ecode') as ecode ,get_json_object(json,'$.b') as code, get_json_object(json,'$.c') from complexjson_guru;
4) select * from complexjson_guru;

实时项目中的 Hive – 何时何地使用

在Hadoop生态系统中何时何地使用Hive:

日期

  • 在 Hadoop 生态系统中使用强大而有效的统计函数时
  • 在处理结构化和半结构化数据时
  • 作为一款基于Hadoop的数据仓库工具
  • 使用 HBase 进行实时数据摄取,其中可以使用 Hive。

地点

  • 为了方便用作 ETL 和数据仓库工具
  • 使用 HiveQL 提供 SQL 类型的环境并进行类似 SQL 的查询。
  • 根据特定客户需求,使用和部署自定义的 map 和 reducer 脚本

常见问题

LOCAL 参数会从客户端计算机的文件系统中复制文件。如果没有 LOCAL 参数,Hive 会将路径视为 HDFS 路径并移动文件,因此相对路径会解析到用户的 HDFS 主目录下。

通常情况下,`json_tuple()` 速度更快:它只解析一次文档,并将多个键一起返回,而 `get_json_object()` 会为每个字段重新解析字符串。如果只获取单个值,请使用 `get_json_object()`。

不。一个 STRING 列加上 JSON 函数就可以了。像 org.apache.hive.hcatalog.data.JsonSerDe 这样的 SerDe 适合重复的生产环境查询和映射。ping 将键值一次性写入到已键入的列中,而不是每次读取时都写入。

通常情况下,Hive 会生成一个格式化的文件:它要求每行包含一个完整的 JSON 文档,因此跨行的文档会被视为无效行。JSONPath 中拼写错误的键或大小写错误也会导致同样的问题。

xpath() 函数总是返回一个字符串数组。请改用类型化的变体:xpath_string()、xpath_int()、xpath_long()、xpath_float()、xpath_double() 或 xpath_boolean()。每个函数都会返回一个该类型的标量值。

对于原始着陆数据而言,外部存储更安全,因为存在丢包风险。ping 表会保留文件。托管表会在执行 DROP 操作时删除其数据目录——这对于临时表来说很方便,但对于共享文件来说则会造成破坏。

机器学习工具会对样本文件进行分析,以推断数据类型、标记稀疏键并根据查询模式建议分区列。请将输出结果视为草稿——数据类型和分区仍需与实际数据进行比对验证。

它会根据粘贴到编辑器中的示例记录,自动生成 CREATE TABLE 语句、LOAD DATA 命令和 JSONPath 表达式。由于它无法直接访问集群,因此需要先验证名称、路径和键的拼写。

总结一下这篇文章: