【问题标题】:Hive get_json_object(): How to check if JSON field exists?Hive get_json_object():如何检查 JSON 字段是否存在?
【发布时间】:2018-07-26 20:51:12
【问题描述】:

我正在使用 Hive 和 get_json_object() 函数来查询存储为 JSON 的数据。 JSON 有一个 coordinate 键和两个字段(纬度和经度),如下所示:

   "coordinate":{  
      "center":{  
         "lat":36.123413127558536,
         "lng":-115.17381648045654
      },
      "precision":10
   }

我正在运行我的 Hive 查询以检索某个地理坐标框中的数据,如下所示:

INSERT OVERWRITE LOCAL DIRECTORY '/home/user.name/sample/sample1.txt'
    SELECT * FROM mytable
    WHERE
    get_json_object(mytable.`value`, '$.coordinate.center.lat') > 36.115767
    AND get_json_object(mytable.`value`, '$.coordinate.center.lng') > -115.314051
    AND get_json_object(mytable.`value`, '$.coordinate.center.lat') < 36.285595
    AND get_json_object(mytable.`value`, '$.coordinate.center.lng') < -115.085399
    DISTRIBUTE BY rand()
    SORT by rand()
    LIMIT 10000;

但是,问题在于,对于某些行,缺少 coordinate 字段,或者缺少 center 字段,或者缺少 lat 和/或 lng 字段。如何修改我的 Hive SELECT 查询以仅获取具有完整有效 coordinate 条目以及现有 latlng 的行?

【问题讨论】:

    标签: hadoop hive hiveql


    【解决方案1】:

    我会为你做的表做一个单独的视图

    WHERE get_json_object(...) IS NOT NULL 
    

    对于您感兴趣的每个领域。

    然后在该视图上运行给定的查询

    或者,修复您的输入源以使用 Avro 生成一些一致的数据,例如

    【讨论】:

    • 我可以在原始查询的 WHERE 子句中放置多个 get_json_object(...) IS NOT NULL 检查,而不是创建另一个视图,对吗?例如,get_json_object(mytable.value, '$.coordinate') IS NOT NULL AND get_json_object(mytable.value, '$.coordinate.center') IS NOT NULL 等?
    • 你可以,但是看起来很乱:)
    • 你知道 Hive 是否使用布尔短路评估 WHERE 子句吗?例如,如果我的表达式是WHERE A AND B AND C,而A 为假,那么Hive 会在评估BC 之前停止吗?
    • 我真的不记得了。不过,您可以对括号进行分组
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多