我使用JSON格式的twitter数据并创建了我的Hive结构来存储数据。我还使用SerDe org.openx.data.jsonserde.JsonSerDe来序列化/反序列化每一行。
我有一个有问题的列,那就是geo列(碰巧是我的应用程序最重要的列)。该列的结构如下(底部的完整结构):
geo struct<coordinates:array<double>, type:string>这适用于具有正确数据的行:"geo":{"type":"Point",“correct”:0.123337,0.955139}
然而,对于geo列,我的大部分数据包含以下内容:"geo":"None“
这会导致以下SerDe错误:数据不是JSONObject,而是值为None的java.lang.String
格式化我的数据并不是一个真正的选择,因为有将近1TB的原始文本文件,所以如果可能的话,我想避免这种情况!
也许我需要编写自己的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/';发布于 2015-07-21 00:35:23
问题似乎不是未填充的数据。因为,没有数据的正确格式化的json应该类似于{"type":null,“correct”:null},它应该由serde获取并进行相应的解析。
和"ignore.malformed.json",将只负责json级别的不正确格式,并根据文档跳过记录。
因此,考虑到您的情况,json创建的来源实际上是在没有数据时发出完全不同的格式的罪魁祸首。我假设你不能改变它(但如果你能,那就太好了)。所以最终的解决方案似乎是编写你自己的serde,因为似乎没有任何属性来处理这种情况,一个新的数据类型即将到来(String而不是定义的json)。
这是一个很好的用例,这是由于缺乏对不同层的理解。在这方面,除了你自己的回答之外,我也在等待任何答案。
https://stackoverflow.com/questions/31503223
复制相似问题