json - 如何从json数据创建hive表

标签 json hadoop hive

我见过一些表对一个数据表使用一行 json 代码。下面的 json 不是这种形式。相反,整个文件是一个 json 文件,它基本上是一个字典的字典。有谁知道如何做到这一点?

json

{
  "aa": {
    "a": "A",
    "b": "B",
    "c": "C",
    "d": [
      {
        "d_1": "D-1",
        "d_2": "D-2"
      }
    ],
    "e": "E"
  },
  "bb": {
    "a": "AA",
    "b": "BB",
    "c": "CC",
    "d": [
      {
        "d_1": "DD-11",
        "d_2": "DD-22"
      }
    ],
    "e": "EE"
  }
}

hive 表

drop table if exists test_json_letters;
create table test_json_letters 
(
my_array ARRAY<struct<
    a:string,
    b:string,
    c:string,
    d:array<struct<
        d_1:string,
        d_2:string
    >>
    e:string
    >>
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 'path/to/table';

输出应该是

aa,A,B,C,D-1,D-2
bb,AA,BB,CC,DD-11,DD-22

A,B,C,D-1,D-2
AA,BB,CC,DD-11,DD-22

无论哪种方式对我来说都很好。另外,我并不是 100% D 部分应该是什么样子。我也可以使用 [{d_1": "D-1","d_2": "D-2"}] 而不是上面的内容。我对 json 完全陌生和 hive 表,所以我很灵活。

错误是显示所有 560 种可能性? (y 或 n) 在 `a:string 之后,所以存在一些格式问题,但我不确定它们是什么。

最佳答案

我会尝试如下

您的数据

{"aa": {"a": "A","b": "B","c": "C","d": [{"d_1": "D-1","d_2": "D-2"}],"e": "E"},"bb": {"a": "AA","b": "BB","c": "CC","d": [{"d_1": "DD-11","d_2": "DD-22"}],"e": "EE"}}

建表语句

CREATE TABLE my_table(aa struct<
    a:string,
    b:string,
    c:string,
    d:array<struct<
        d_1:string,
        d_2:string>>,
    e:string>)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS TEXTFILE
LOCATION '/user/training/json';

查询表

SELECT * FROM my_table;
+----------------------------------------------------+--+
|                    my_table.aa                     |
+----------------------------------------------------+--+
| {"a":"A","b":"B","c":"C","d":[{"d_1":"D-1","d_2":"D-2"}],"e":"E"} |
+----------------------------------------------------+--+
SELECT aa.a FROM my_table;
+----+--+
| a  |
+----+--+
| A  |
+----+--+
SELECT aa.d FROM my_table;
+------------------------------+--+
|              d               |
+------------------------------+--+
| [{"d_1":"D-1","d_2":"D-2"}]  |
+------------------------------+--+
SELECT aa.d.d_1 FROM my_table;
+----------+--+
|   d_1    |
+----------+--+
| ["D-1"]  |
+----------+--+

另一个具有更复杂结构的好例子是

数据:file2.json

{ "purchaseid": { "ticketnumber": "23546852222", "location": "vizag", "Travelerhistory": { "trav": { "fname": "ramu", "lname": "gogi", "travelingarea": { "destination": { "stationid": "KAJKL", "stationname": "hyd" } }, "food": { "foodpref": [{ "foodcode": "CK567", "foodcodeSegment": "NOVEG" }, { "foodcode": "MM98", "foodcodeSegment": "VEG" } ] } } } } }

建表语句

CREATE TABLE my_table(
purchaseid STRUCT<ticketnumber:STRING,location:STRING,
  Travelerhistory:STRUCT<
    trav:STRUCT<fname:STRING,lname:STRING,
        travelingarea:STRUCT< destination :STRUCT<stationid:string,stationname:string>>,
    food :STRUCT<foodpref:ARRAY<STRUCT<foodcode:string,foodcodeSegment:string>>>
    >>>)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' 
LOCATION '/user/training/json2/';

查询表

select purchaseid.ticketnumber from my_table;
select purchaseid.travelerhistory.trav.fname from my_table;
select purchaseid.travelerhistory.trav.lname from my_table;

and so on

关于json - 如何从json数据创建hive表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61687816/

相关文章:

PHP 如何将字符串从 DomCrawler 转换为 UTF-8

iphone - 如何将 NSDictionary 中的 Key 浮点值添加到 NSarray?

hadoop - 如何从本地磁盘而不是HDFS上的数据在Hive上创建外部表?

hadoop - Hive/Tez作业无法开始

hadoop - 如何搜索具有给定列名的所有表并返回 Hadoop/Hive 中哪些表具有该列名?

javascript - 对象在被赋值之前就已经有了值

php - Laravel 不会遵守状态码

hadoop - 如何检查我的集群中使用的 hadoop 发行版?

hadoop - 测试大数据框架需要什么环境?

Hadoop MR2 作业统计