如何将特定数据从HDFS加载到HIVE

时间:2018-08-16 08:38:43

标签: hive hdfs

我有一个文本格式的名为Patient的文件,该文件在HDFS中具有以下格式的数据

e93f4078|8e09-4699|Patient|2018-04-30 10:02:46.766078|2018-04-28 06:20:38.435445|null|{"id": "8e09-4699", "meta": {"versionId": "e93f4078-f01e2a4e}}|null
315b0f5f|442a-a6d2|Patient|2018-04-30 11:18:20.725076|2018-04-30 09:42:05.603234|null|{"id": "442a-a6d2", "meta": {"versionId": "315b0f5f-6105"}} |null

我想将具有json的特定列加载到列名称为id和meta的Hive表中。任何人都可以建议这样做的想法。

2 个答案:

答案 0 :(得分:1)

您可以分两个阶段进行操作。

  1. 按原始格式从csv加载此数据集,其中包含所有这些单独的列(管道分隔)。您应该有一栏包含json文本。

  2. 从原始表中选择json列,并使用两列id和meta填充数据表。

答案 1 :(得分:1)

使用 Regex Serde 并仅捕获文本文件中的 id和元值

尝试下面的hive.ddl:

hive> CREATE TABLE details(
  id STRING,
  meta string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES  (
"input.regex" = "^.+:\\s\"(.*?)\",\\s\"meta\":\\s+(.*)}.+$"
)
STORED AS TEXTFILE;

从配置单元表中选择:

hive> select * from details;
+------------+------------------------------------+--+
|     id     |                meta                |
+------------+------------------------------------+--+
| 8e09-4699  | {"versionId": "e93f4078-f01e2a4e}  |
| 442a-a6d2  | {"versionId": "315b0f5f-6105"}     |
+------------+------------------------------------+--+

根据需要在hive.ddl中更改正则表达式。

(或)

另一种方法是使用|创建临时配置表。分隔,然后使用 get_json_object。 .etc函数,您只能从临时配置单元表中提取所需的数据,然后插入到新目标表中< / strong>。