Spark SQL操作JSON字段的小技巧
前言
介绍spark sql的json支持,这是我们在databricks中开发的一个功能,可以在spark中更容易查询和创建json数据。随着网络和移动应用程序的普及,json已经成为web服务api以及长期存储的常用的交换格式。使用现有的工具,用户通常会使用复杂的管道来在分析系统中读取和写入json数据集。在apache spark 1.1中发布spark sql的json支持,在apache spark 1.2中增强,极大地简化了使用json数据的端到端体验。
很多时候,比如用structure streaming消费kafka数据,默认可能是得到key,value字段,key是偏移量,value是一个byte数组。很可能value其实是一个json字符串。这个时候我们该如何用sql操作这个json里的东西呢?另外,如果我处理完的数据,我想写入到kafka,但是我想把整条记录作为json格式写入到kafka,又该怎么写这个sql呢?
get_json_object
第一个就是get_json_object,具体用法如下:
select get_json_object('{"k": "foo", "v": 1.0}','$.k') as k
需要给定get_json_object 一个json字段名(或者字符串),然后通过类似jsonpath的方式去拿具体的值。
这个方法其实有点麻烦,如果要提取里面的是个字段,我就要写是个类似的东西,很复杂。
from_json
具体用法如下:
select a.k from ( select from_json('{"k": "foo", "v": 1.0}','k string, v string',map("","")) as a )
这个方法可以给json定义一个schema,这样在使用时,就可以直接使用a.k这种方式了,会简化很多。
to_json
该方法可以把对应字段转化为json字符串,比如:
select to_json(struct(*)) as value
可以把所有字段转化为json字符串,然后表示成value字段,接着你就可以把value字段写入kafka了。是不是很简单。
处理具有大量字段的json数据集
json数据通常是半结构化、非固定结构的。将来,我们将扩展spark sql对json支持,以处理数据集中的每个对象可能具有相当不同的结构的情况。例如,考虑使用json字段来保存表示http标头的键/值对的数据集。每个记录可能会引入新的标题类型,并为每个记录使用一个不同的列将产生一个非常宽的模式。我们计划支持自动检测这种情况,而是使用map类型。因此,每行可以包含map,使得能够查询其键/值对。这样,spark sql将处理具有更少结构的json数据集,推动了基于sql的系统可以处理的那种查询的边界。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。