MySQL多行合并--GROUP_CONCAT函数,转换json数组--JSON_ARRAY() 函数,转换json对象--json_object()函数

文章介绍了在MySQL中如何使用GROUP_CONCAT函数合并多行数据为一行,以及如何利用JSON_OBJECT和JSON_ARRAY函数将查询结果转换为JSON对象和数组。示例展示了如何结合这些函数进行复杂的数据转换操作,如创建包含多个字段的JSON结构。
摘要由CSDN通过智能技术生成

GROUP_CONCAT: 多行合并

在表设计中,一个字段可能会对应多条数据,但在有的查询场景下,需要实现将多行数据合并成一行数据,在MySQL中可以使用GROUP_CONCAT函数来实现

id

pid

name

2

1

篮球

3

1

足球

正常查出来是两条数据,如果需要一条,就可以用GROUP_CONCAT

GROUP_CONCAT(field1)这样默认就是一个字段用逗号拼接

select pid ,GROUP_CONCAT(name) from table,结果就是

pid

name

1

篮球,足球

GROUP_CONCAT(field1,'-',field2)这样默认就是两个个字段用-拼接

select pid ,GROUP_CONCAT(id,'-',name) from table,结果就是

pid

name

1

2-篮球,3-足球

json_object: 创建Json对象

如果要将查出来的字段转换成json对象,可以用这个函数:JSON_OBJECT('id',id,'name',name)

select pid ,JSON_OBJECT('id',id,'name',name) from table,结果就是

pid

name

1

{"id": 2, "name": "篮球"}

1

{"aid": 3, "name": "足球"}

json_array:创建Json数组

如果要将查出来的字段转换成json数组,可以用这个函数:json_array(id,name)

select pid ,JSON_ARRAY(id,name) from table,结果就是

pid

name

1

[2, "篮球"]

1

[3, "足球"]

这就是最简单的使用方法了,当然了,大家可以继续深化使用,

比如JSON_ARRAY(JSON_OBJECT('id',id,'name',name) )

比如 GROUP_CONCAT(JSON_OBJECT('id',id,'name',name))

等等

放一个例子:

select `key`, json_array(GROUP_CONCAT(JSON_OBJECT('name', name, 'aid', aid,'preview_address',preview_address,'whether_receive',whether_receive,'free_or_not',free_or_not)))  as res from (
SELECT 'templateList' as `key`,aid,template_name as `name`,preview_address ,whether_receive,free_or_not from 
(SELECT * FROM lb_free_template_material ORDER BY create_time DESC LIMIT 12) t1
union all
SELECT 'stickerList' as `key`,aid,sticker_name as `name`,preview_address ,whether_receive,free_or_not from 
(SELECT * FROM lb_free_sticker_material ORDER BY create_time DESC LIMIT 12) t2  
union all
SELECT 'fontList' as `key`,aid,font_name as `name`,preview_address ,whether_receive,free_or_not from 
(SELECT * FROM lb_free_font_material ORDER BY create_time DESC LIMIT 12) t3   
union all
SELECT 'brushList' as `key`,aid,brush_name as `name`,preview_address ,whether_receive,free_or_not from 
(SELECT * FROM lb_free_brush_material ORDER BY create_time DESC LIMIT 12) t4    
union all
SELECT 'dynamicList' as `key`,aid,dynamic_effect_name as `name`,preview_address ,whether_receive,free_or_not from 
(SELECT * FROM lb_free_dynamic_material ORDER BY create_time DESC LIMIT 12) t5   
union all
SELECT 'backgroundList' as `key`,aid,background_name as `name`,preview_address ,whether_receive,free_or_not from 
(SELECT * FROM lb_free_background_material ORDER BY create_time DESC LIMIT 12) t6  
 
) t group by  `key`;
spark + hive 自定义聚合函数回顾--group_concat实现 group_concat是一种常用的聚合函数,它可以将同一组内的多个值合并成一个字符串。在hive中,group_concat函数已经内置,但是在spark中需要自定义实现。 实现group_concat函数的步骤如下: 1. 继承org.apache.spark.sql.expressions.UserDefinedAggregateFunction类,实现其抽象方法。 2. 定义输入和输出的数据类型。 3. 实现update方法,用于更新聚合结果。 4. 实现merge方法,用于合并不同分区的聚合结果。 5. 实现evaluate方法,用于输出最终的聚合结果。 下面是一个简单的group_concat实现示例: import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.types.{DataType, StringType, StructType} import org.apache.spark.sql.{Row, SparkSession} class GroupConcat extends UserDefinedAggregateFunction { // 定义输入数据类型 def inputSchema: StructType = new StructType().add("value", StringType) // 定义中间缓存数据类型 def bufferSchema: StructType = new StructType().add("buffer", StringType) // 定义输出数据类型 def dataType: DataType = StringType // 定义是否是确定性的 def deterministic: Boolean = true // 初始化中间缓存数据 def initialize(buffer: MutableAggregationBuffer): Unit = { buffer.update(0, "") } // 更新中间缓存数据 def update(buffer: MutableAggregationBuffer, input: Row): Unit = { val str = input.getString(0) if (!buffer.isNullAt(0)) { buffer.update(0, buffer.getString(0) + "," + str) } else { buffer.update(0, str) } } // 合并不同分区的中间缓存数据 def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = { if (!buffer2.isNullAt(0)) { update(buffer1, buffer2) } } // 输出最终的聚合结果 def evaluate(buffer: Row): Any = { buffer.getString(0) } } // 使用示例 val spark = SparkSession.builder().appName("group_concat").master("local[*]").getOrCreate() spark.udf.register("group_concat", new GroupConcat) val df = spark.sql("select id, group_concat(name) as names from table group by id") df.show() 在使用时,需要先将自定义的聚合函数注册到spark中,然后就可以在sql中使用了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值