如何将特定数据从hdfs加载到hive

zd287kbt  于 2021-06-26  发布在  Hive
关注(0)|答案(2)|浏览(481)

我有一个名为patient的文本文件,它的数据格式如下

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的配置单元表中。有人能提出这样做的建议吗。

ej83mcc0

ej83mcc01#

使用regex serde并只捕获文本文件中的id和meta值。
尝试使用以下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中的正则表达式。
(或)
另一种方法是创建带有|分隔符的temp hive表,然后通过使用get | json | object..etc函数,您只能从temp hive表中提取所需的数据,然后插入到新的目标表中。

jgzswidk

jgzswidk2#

你可以分两个阶段来做。
从csv加载这个数据集,就像在原始表中一样,包含所有这些单独的列(管道分隔)。您应该有一个包含json文本的列。
从原始表中选择json列,并用id和meta两列填充数据表。

相关问题