Hive中如何加载和解析(嵌套)json数据

=Start=

缘由:

最近经常使用Hive进行数据分析,其中有一个比较典型的场景就是——部分有效的数据在一个大的多层嵌套结构json字符串中,该如何进行匹配和比对,可行的方法应该有不少,我这里先记录一下我知道和实际用到的,方便以后参考。

正文:

参考解答:

&

&

&

 

参考链接:

=END=

声明: 除非注明,ixyzero.com文章均为原创,转载请以链接形式标明本文地址,谢谢!
https://ixyzero.com/blog/archives/4208.html

《Hive中如何加载和解析(嵌套)json数据》上有9条评论

  1. Hive Plays Well with JSON
    https://pkghosh.wordpress.com/2012/05/06/hive-plays-well-with-json/

    get_json_object函数第一个参数填写json对象变量,第二个参数使用$表示json变量标识,然后用 . 或 [] 读取对象或数组;但它每次只能查一个字段,因为这个方法,只能接受两个参数,多的不行,那么就导致我们对同一个json数据想要查看多个值,只能多写几个get_json_object,比较麻烦,所以另一个json_tuple方法就派上了用场。

    json_tuple函数可以一次查询多个字段,但它的缺点就是对于复杂的嵌套的json,就操作不了了(就是说使用不了".",“[]”这种符号来操作json对象),所以看情况选择这两个方法去使用。

  2. 一例 Hive join 优化实战
    https://my.oschina.net/leejun2005/blog/307812

    Hive的严格模式
    https://www.cnblogs.com/benchen/p/5817420.html
    https://stackoverflow.com/questions/42261935/how-allow-hive-mapred-mode-nonstrict

    LanguageManual Joins
    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins

    SELECT a.* FROM a JOIN b ON (a.id = b.id)
    SELECT a.* FROM a JOIN b ON (a.id = b.id AND a.department = b.department)

    SELECT a.val, b.val, c.val
    FROM
    a
    JOIN
    b ON (a.key = b.key1)
    JOIN
    c ON (c.key = b.key2)

  3. Hive中如何将微秒转换成直观的日期格式?(Hive from_unixtime for milliseconds)
    https://stackoverflow.com/questions/27942930/hive-from-unixtime-for-milliseconds

    select from_unixtime(1543908748678,'yyyyMMdd'); # 508940709
    select from_unixtime(1543908748.678,'yyyyMMdd') # FAILED: SemanticException [Error 10014]: Line 1:7 Wrong arguments ''yyyyMMdd'': No matching method for class org.apache.hadoop.hive.ql.udf.UDFFromUnixTime with (double, string). Possible choices: _FUNC_(bigint) _FUNC_(bigint, string) _FUNC_(int) _FUNC_(int, string)
    select from_unixtime(1543908748,'yyyyMMdd') # 20181204

    select 1543908748678, from_unixtime(CAST(1543908748678/1000 as BIGINT), 'yyyy-MM-dd'); # 1543908748678 2018-12-04
    select 1543908748678, from_unixtime(CAST(1543908748678/1000 as BIGINT), 'yyyy-MM-dd_HH:mm:ss') # 1543908748678 2018-12-04_15:32:28

    Hive中如何将日期字符串转换成timestamp格式?(Convert string to timestamp in Hive)
    https://stackoverflow.com/questions/17796071/convert-string-to-timestamp-in-hive

  4. Hive常用字符串函数
    https://www.iteblog.com/archives/1639.html

    1、字符串长度计算函数:length
    2、字符串反转函数:reverse
    3、字符串连接函数:concat
    4、带分隔符字符串连接函数:concat_ws
    5、字符串截取函数:substr,substring
    6、字符串截取函数:substr,substring
    7、字符串转大写函数:upper,ucase
    8、字符串转小写函数:lower,lcase
    9、去空格函数:trim
    10、左边去空格函数:ltrim
    11、右边去空格函数:rtrim
    12、正则表达式替换函数:regexp_replace
    13、正则表达式提取函数:regexp_extract
    14、URL解析函数:parse_url
    15、json解析函数:get_json_object
    16、空格字符串函数:space
    17、重复字符串函数:repeat
    18、首字符ascii函数:ascii
    19、左补足函数:lpad
    20、右补足函数:rpad
    21、分割字符串函数: split
    22、集合查找函数:find_in_set

    Hive中内置的字符串处理函数
    https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-StringFunctions

  5. Hive中的「非」该怎么写?
    https://stackoverflow.com/questions/5627996/is-there-a-hive-equivalent-of-sql-not-like

    试试:
    where not (Col_Name like '%whatever%')
    或者:
    where not (Col_Name rlike '.*whatever.*')

    和SQL里面是不一样的!!!

    在SQL中,「非」的表示方法:
    select * from table_name where column_name not like '%something%';

    在Hive中,「非」的表示方法
    select * from table_name where not (column_name like '%something%');

  6. 如何在 Apache Hive 中解析 Json 数组
    https://www.iteblog.com/archives/2362.html

    -- 测试数据
    -- '[{"bssid":"12:34:56:78:11:50","ssid":"ChinaNet-xyz"}]'

    -- 方法一:直接用 get_json_object 处理
    select get_json_object('[{"bssid":"12:34:56:78:11:50","ssid":"ChinaNet-xyz"}]', '$.[0].ssid')
    -- ChinaNet-xyz

    select regexp_replace('[{"bssid":"12:34:56:78:11:50","ssid":"ChinaNet-xyz"}]', '\\[|\\]', '')
    -- {"bssid":"12:34:56:78:11:50","ssid":"ChinaNet-xyz"}

    -- 方法二:先将方括号去掉再作为一个单一json字符串进行处理(只适用于json数组长度为1的情况)
    select get_json_object(regexp_replace('[{"bssid":"12:34:56:78:11:50","ssid":"ChinaNet-xyz"}]', '\\[|\\]', ''), '$.ssid')
    -- ChinaNet-xyz

发表评论

电子邮件地址不会被公开。 必填项已用*标注