从Hive中的Json数据中提取Json

时间:2018-10-05 06:34:14

标签: json hive

在Hive中名为客户表的详细信息的列中,我有以下json格式的数据:

 {
      "customer" : {
        "given_name" : "Anuvrat",
        "surname" : "Singh"
      }, 
      "order" : {
        "id" : "123dfe523gd"
      },
    "address" : {
        "city" : "kolkata",
        "pin" : "700091"
      },
   "phone" : {
        "mobile" : "*********"
      }
    }

我必须从json数据中删除地址和电话,并且数据应类似于:

{
  "customer" : {
    "given_name" : "Anuvrat",
    "surname" : "Singh"
  }, 
  "order" : {
    "id" : "123dfe523gd"
  }
}

如何对表中存在的每一行执行(即更新)?

我尝试了以下命令hadoop fs -cat /home/customer/* | jq '.details[] |= del(.address,.phone)',但我却获得了预期的输出,而不是出现错误提示

parse error: Invalid numeric literal at line 1, column 93
cat: Unable to write to output stream.

2 个答案:

答案 0 :(得分:0)

如果您愿意使用不使用Hive的解决方案,我想说明一下,jq command line JSON parser可以很容易做到这一点。

鉴于您的输入文件,您将执行以下操作:

jq 'del(.address,.phone)' file

如果要删除表中所有条目的addressphone对象,可以执行以下操作:

jq '.[] |= del(.address,.phone)' file

答案 1 :(得分:0)

这是我为了得到上述结果而运行的查询:

INSERT OVERWRITE TABLE customer Select id,CASE WHEN id is not null THEN concat('{"customer":',get_json_object(details,'$.customer'),',"order":',get_json_object(details,'$.order'),'"}') ELSE details END AS details  FROM customer;