b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

json格式转换工具 一种解决Impala自定义属性查询的方案

电脑杂谈  发布时间:2018-01-29 20:08:37  来源:网络整理

json格式转换工具_json格式_u盘格式怎么转换

在使用Impala做自助分析的过程中,我们经常发现自定义属性的需求,通常情况下用户会将这种不确定key的字段全部塞到一个MAP字段中,然后通过Impala的复杂结构查询语法进行查询,目前Impala只支持Parquet格式表的schema中使用复杂数据类型(包括STRUCT、ARRAY和MAP),查询语法可以参考 Impala复杂类型语法,但是它存在两个弊端:语法不兼容hive和查询性能不理想。第一个问题是由于特定的实现方式导致的,第二个问题则是由于parquet存储MAP类型的字段决定的。那么有没有办法提升用户的这种查询需求和简化查询SQL的写法呢?

为了避免MAP在impala中复杂的使用方式和性能不好的问题,我们一般建议使用JSON字符串的方式代替map存储表达的字段内容,毕竟json能够完全表示出MAP的语义,而开发一般使用JAVA实现,也比较方便生成JSON格式的数据。通过使用json解析的UDF来抽取其中想要的字段,我们首先使用了一个开源的JSON UDF的实现 ,这个开源的实现使用了rapidjson作为json解析器,它的使用方法类似于hive的get_json_object,函数定义如下:

STRING get_json_object(STRING, STRING)

第一个参数为输入的json字符串,第二个参数是需要解析的内容,该内容通过如下方式解析:

$ : Root object(表示根节点)

. : Child operator(表示父节点和子节点的分隔符)

[] : Subscript operator for array(访问数组)

: Wildcard for [] (通配符)

例如对于一个{“hello”, “world”}的JSON字段(字段名为col)想要提取hello的值,可以使用get_json_object(col, “$.hello”)得到的值就是”world”。

通过它可以提取map中想要的字段,它的实现原理是用rapidjson解析输入的第一个参数,解析成Document之后再通过解析第二个参数选取想要的字段内容,通过对比测试原生map的查询和使用这个UDF进行测试的结果如下:

测试发现json自定义函数的性能并不如原生map查询的性能,我认为主要是基于两方面的原因:

使用json字符串需要读取更多的数据,根据profile可以看到JSON格式的列要比map多读取一倍的数据量。

每一个JSON列都需要解析转换成Document对象,解析过程中rapidjson不可避免的又会进行一些数据拷贝操作,整个解析的代价是比较大的。

意识到该问题之后,我们就需要想办法减少如上两个方面的开销,首先对于存储空间的减少,但是对于json的结构,内容是相对比较规定的,这点不容易优化,而第二点,我们是否能够在不解析整个json字符串就获取到想要的结果呢?假设它不是一个json字符串,而是一个key:value的存储格式,我们可以轻松的顺序查找,找到对应的key就直接返回value的,按照这个思路,我们自己涉及了一种解析JSON的逻辑,基于如下的状态机:

u盘格式怎么转换_json格式_json格式转换工具

这是一个对于一层结构的JSON的字符串进行解析的状态机(也不考虑数组),将这个字符串遍历分为多个状态,例如当从字符串开始遇到‘{’字符就将状态转换为FIND_KEY,进行查找key的操作,当遇到双引号表示已经找到了key,此时我们就可以将找到的key与输入的key进行比较,如果相同则下一个找到的value就是查找的结果,这样的做法将JSON的解析转换成了一个关键字查找的过程,平均时间复杂度大大降低,添加该UDF进行测试发现如下的对比结果:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-63711-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...