【问题标题】:How to load particular data from HDFS to HIVE如何将特定数据从 HDFS 加载到 HIVE
【发布时间】:2018-08-16 20:40:53
【问题描述】:

我有一个名为患者的文本形式的文件,该文件在 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 表中。任何人都可以建议这样做的想法。

【问题讨论】:

    标签: hive hdfs


    【解决方案1】:

    您可以分两个阶段进行。

    1. 从 csv 加载此数据集,在原始表中使用所有这些单独的列(管道分隔)。您应该有一列带有 json 文本。

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

    【讨论】:

    • 如何检查特定字符串的 versionId?我确实喜欢: select * from patient where get_json_object(meta,'$.versionId')like 'e93f4078-f01e2a4e' 但它没有相应地工作。
    • 我认为你应该像get_json_object(col_with_json, '$.meta.versionId')那样做某事
    • 基本上你需要提供元素的完整路径,而不仅仅是最新的名称。
    • 是的,我也尝试过。但徒劳无功。从 get_json_object(meta,'$.meta.versionId') 不为空的患者中选择 *;从 get_json_object(meta,'$.meta.versionId') 为空的患者中选择 *;这两个查询都有效,但不是我想要的。
    • 您上面的 JSON 无效。每个打开的报价都必须有一个关闭的报价。非常适合我:select get_json_object('{"id": "8e09-4699", "meta": {"versionId": "e93f4078-f01e2a4e"}}', '$.meta.versionId');
    【解决方案2】:

    使用 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 函数,您可以只从 temp hive 表 中提取所需的数据,然后 插入到新目标表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 2017-08-29
      相关资源
      最近更新 更多