从配置单元中的json数据提取json

9fkzdhlc  于 2021-06-27  发布在  Hive
关注(0)|答案(2)|浏览(314)

我在hive中名为customer的表details列中有以下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.
b1payxdu

b1payxdu1#

如果你对一个不使用Hive的解决方案持开放态度,我想说的是,这是一个非常容易做到的事情 jq 命令行json解析器。
给定输入文件,您将执行以下操作:

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

如果你想移除 address 以及 phone 对象,您可以执行以下操作:

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

ou6hu8tu2#

这是我运行以获得上述结果的查询:

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;

相关问题