Json 数据放入 hive 堆大小错误

Posted

技术标签:

【中文标题】Json 数据放入 hive 堆大小错误【英文标题】:Json data into hive heap size error 【发布时间】:2018-03-14 08:33:57 【问题描述】:

我正在处理我使用 nifi 从 facebook 获得的嵌套 json 数据。我在 hive 中创建了一个表并使用命令加载数据。

CREATE TABLE abmediaanalysis (id string, posts struct< data:array<struct< message:string, shares:struct< count:int>, id:string, reactions:struct< data:array<struct< name:string,id:string>>, paging:struct< cursors:struct< before:string,after:string>, next:string>>, likes:struct< data:array<struct< id:string>>, paging:struct< cursors:struct< before:string,after:string>, next:string>>>>, paging:struct< previous:string,next:string>>, feed struct< data:array<struct< permalink_url:string,message:string,id:string>>, paging:struct< previous:string,next:string>>)ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe';

load data local inpath '/home/10879/facebook1480479682880.json' overwrite into table abmediaanalysis;

我还添加了 jar 文件 json-serde-1.3.8-jar-with-dependencies.jar, 但是当我使用 lateral view explode 打印所有列时,我得到了java heap size error。我也增加了堆大小,但仍然是同样的错误

select id,posts_message,posts_share_count,posts_id,feed_data_permalink_url,feed_data_message,feed_data_id,reaction_data_name,reaction_data_id,posts_likes_data_id from abmediaanalysis
LATERAL VIEW explode(posts.data.message)MSG as posts_message
LATERAL VIEW explode(posts.data.shares.count)CT as posts_share_count
LATERAL VIEW explode(posts.data.id) I as posts_id
LATERAL VIEW explode(feed.data.permalink_url) PU as feed_data_permalink_url
LATERAL VIEW explode(feed.data.message) MSG as feed_data_message
LATERAL VIEW explode(feed.data.id) I as feed_data_id
LATERAL VIEW explode(posts.data.reactions) NM as posts_reactions_name
LATERAL VIEW explode(posts_reactions_name.data.name) NM as reaction_data_name
LATERAL VIEW explode(posts_reactions_name.data.id) NM as reaction_data_id
LATERAL VIEW explode(posts.data.likes) I as likes_data_id
LATERAL VIEW explode(likes_data_id.data.id) I as posts_likes_data_id;

当我尝试打印两列或三列而不是显示 616 条记录时,它大约显示 15625 条记录。 任何人都可以帮助解决这个问题 是否有机会直接从 nifi 将上述 json 数据加载到 hive 表中?如果可以,你能告诉我。

提前致谢

【问题讨论】:

我添加了另一种方法,可能对您有用。 【参考方案1】:

如果我可以建议您另一种方法,将整个 JSON 字符串作为 String 数据类型加载到外部表中。

例如

CREATE EXTERNAL TABLE json_data_table (
    id String,
    json_data String
    )   
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\u0001' LINES TERMINATED BY '\n' STORED AS TEXTFILE 
LOCATION '/path/to/json';

使用Hive get_json_object 提取各个列。例如

如果 json_data 列有以下 JSON 字符串

"store":
  "fruit":\["weight":8,"type":"apple","weight":9,"type":"pear"],
   "bicycle":"price":19.95,"color":"red"
  ,
 "email":"amy@only_for_json_udf_test.net",
 "owner":"amy"

下面的查询获取

SELECT get_json_object(json_data, '$.owner') FROM json_data_table;

返回amy

通过这种方式,您可以从表中提取每个 json 元素作为列。

【讨论】:

以上是关于Json 数据放入 hive 堆大小错误的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate中容易犯的小错误(有图)

JavaScript中易犯的小错误-------常见错误三:内存泄露

php 编译小错误

JavaScript中易犯的小错误-------常见错误七:原型继承问题

CSS网页布局中易犯的10个小错误

JavaScript中易犯的小错误-------常见错误四:比较运算符