2

我正在尝试使用 JSON Serde 将 JSON 文件加载到 Hive 中。我能够一次让它为一个 JSON 文件工作,但我想知道是否有可能一次在 JSON 文件中有多个记录并一次加载它们。给出一个想法,我的 JSON 文件如下所示:

文件 1

{"styles": {"style": "Deep House"}, "genres": {"genre": "Electronic"}}

文件 2

{"styles": {"style": "Rock"}, "genres": {"genre": "Techno Rock"}}

我将它们组合成一个 JSON 文件,如下所示:

{"styles": {"style": "Deep House"}, "genres": {"genre": "Electronic"}},{"styles": {"style": "Rock"}, "genres": {"genre": "Techno Rock"}}

当我加载这个文件时,只加载了第一条记录。我的表 DDL 如下:

create table json_data (
styles struct<style: string>,
genres struct<genre: string>
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe';

我使用标准LOAD命令。

LOAD DATA LOCAL INPATH '/home/user/json_data' INTO TABLE json_data;

当我查询表时,只插入了一条记录。

select * from json_data;
    {"style":"Deep House"}  {"genre":"Electronic"}
    Time taken: 0.76 seconds

我在创建 JSON 文件时做错了吗?或者不可能在一个 JSON 文件中有两条记录?任何帮助将非常感激。

谢谢,TM

4

1 回答 1

3

您可以将多个 Json 记录加载到配置单元表中,但只有每个 Json 记录应由换行符分隔

json_data 文件内容:

{"styles": {"style": "Deep House"}, "genres": {"genre": "Electronic"}}
{"styles": {"style": "Rock"}, "genres": {"genre": "Techno Rock"}}

select * from json_data;
OK
{"style":"Deep House"}  {"genre":"Electronic"}
{"style":"Rock"}        {"genre":"Techno Rock"}

原因是因为 Json Serde 的实现期望它采用该语法。在下面找到 Jsonserde github 链接的链接

https://github.com/rcongiu/Hive-JSON-Serde/blob/develop/src/main/java/org/openx/data/jsonserde/JsonSerDe.java

于 2014-05-02T20:06:55.870 回答