【问题标题】:Data issue with Hive and JsonSerDeHive 和 JsonSerDe 的数据问题
【发布时间】:2015-07-19 16:12:03
【问题描述】:

我使用 JSON 格式的 twitter 数据并创建了我的 Hive 结构来存储数据。我也在使用 SerDe org.openx.data.jsonserde.JsonSerDe 来序列化/反序列化每一行。

我有一个问题列,它是地理列(对于我的应用程序来说最重要的列)。该列的结构如下(完整的结构在底部):

geo struct<coordinates:array<double>, type:string>

这适用于具有正确数据的行: “地理”:{“类型”:“点”,“坐标”:[0.123337,0.955139]}

但是,我的大部分数据都包含 geo 列的以下内容: “地理”:“无”

这会导致以下 SerDe 错误: 数据不是 JSONObject 而是 java.lang.String,值为 None

格式化我的数据并不是一个真正的选择,因为有将近 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/';

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    问题似乎不在于未填充的数据。因为,没有数据的正确格式的 json 应该是这样的 {"type":null,"coordinates":null},它应该被 serde 拾取,并进行相应的解析。

    而“ignore.malformed.json”只会处理 json 级别的错误格式,并根据文档跳过记录。

    因此,鉴于您的情况,创建 json 的源是在没有数据时发送完全不同格式的实际罪魁祸首。我假设您将无法更改它(但如果可以,那就太好了)。所以最终的解决方案似乎是编写自己的 serde,因为似乎没有任何属性来处理这种情况,新的数据类型即将到来(字符串而不是定义的 json)。

    这是一个很好的用例,由于缺乏对不同层的理解。在这方面,即使我等待除了你自己的 serde 之外的任何答案。

    【讨论】:

    • 感谢您的回复,我现在从您的 cmets 了解了更多。正如您建议的那样,我重新处理了数据,它并没有像预期的那样花很长时间(简单的 java 类就完成了)。故事的寓意——从一开始就确保数据是正确的!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多