我有一个文本格式的名为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表中。任何人都可以建议这样做的想法。
答案 0 :(得分:1)
您可以分两个阶段进行操作。
按原始格式从csv加载此数据集,其中包含所有这些单独的列(管道分隔)。您应该有一栏包含json文本。
从原始表中选择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>。