我正在使用JSON格式的twitter数据并创建了我的Hive结构来存储数据。我也使用SerDe org.openx.data.jsonserde.JsonSerDe来序列化/反序列化每一行。
我有一个问题列,它是geo列(我的应用程序发生的最重要的列)。该列的结构如下(底部的完整结构):
geo struct<coordinates:array<double>, type:string>
这适用于具有正确数据的行: “地球”:{ “类型”: “点”, “坐标”:[0.123337,0.955139]}
但是,我的数据的很大一部分包含以下地理列: “地球”: “无”
导致以下SerDe错误: 数据不是JSONObject,而是值为无
的java.lang.String格式化我的数据实际上并不是一个选项,因为有近1 TB的原始文本文件,所以我想尽可能避免这种情况!
也许我需要编写自己的SerDe以满足此需求,但有人知道我是否可以为非填充地理数据进行演员表演或其他类似事件?
全表结构:
CREATE TABLE tweets (
coordinates struct<coordinates:array<double>, type:string>,
created_at string,
favorite_count int,
geo struct<coordinates:array<double>, type:string>,
lang string,
place struct<attributes:struct<street_address:string>, bounding_box:struct<coordinates:array<array<array<double>>>, type:string>, country:string, country_code:string, full_name:string, id:string, name:string, place_type:string, url:string>,
retweet_count int,
source string,
text string,
timestamp_ms timestamp)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties ("ignore.malformed.json" = "true")
location '/user/hue/tweets/';
答案 0 :(得分:1)
问题似乎不是非填充数据。因为,没有数据的正确格式化的json就像这个{“type”:null,“coordinates”:null},它应该由serde拾取,并相应地解析。
而且“ignore.malformed.json”只会照顾json级别的错误格式,并且按照文档跳过记录。
因此,根据您的情况,json创建的来源是在没有数据时发送完全不同格式的实际罪魁祸首。我假设你不能改变它(但如果可以的话,它会很棒)。因此,最终的解决方案似乎是编写自己的serde,因为似乎没有任何属性来处理这种情况,即新的数据类型即将来临(字符串而不是定义的json)。
它是一个很好的用例,由于缺乏对不同层的理解而导致。在这方面,即使我等待你自己的仆人以外的任何答案。