如下,表1(qq_name)与表2(concat_name)使用查询互相转化,表1-表2可以使用group_concat函数实现,表2-表1一时半会我也想不出来,然后想着是否能用python写出来。
表1(qq_name)如下:
表2(concat_name)如下:
下面是python处理代码:
import pandas as pd
import pymysql
'''创建mysql数据库连接,这里尝试用的是本地数据库,表1名字为qq_name'''
connect = pymysql.connect(host = 'localhost',user = 'root',password = '123456',database = 'yy',port = 3306,charset = 'utf8')
'''读取qq_name表中的内容,赋值给qq_name变量'''
qq_name = pd.read_sql('select * from qq_name',connect)
#这里我们打印下数据库里这表表看下,效果如上图:表1。
print(qq_name)
'''定义一个group_concat函数:表1-表2转化'''
def group_concat(data):
return '_'.join(data)
'''使用groupby聚合,apply传入自定义函数,即可得到concat_name表'''
concat_name = qq_name.groupby('qq')['name'].apply(group_concat).reset_index(drop=False)
#我们打印下concat_name看下,效果如上图:表2。
print(concat_name)
'''定义一个函数,实现concat_name转化为qq_name'''
def restore_qq_name(df):
columns=['qq','name']
'''创建一个DataFrame,即我们需要还原的qq_name'''
qq_name = pd.DataFrame(columns=columns)
'''遍历索引'''
for each in df.index:
'''切分group_concat的字段,返回一个列表'''
name_list = df.loc[each,'name'].split('_')
'''遍历name_list,然后逐条数据添加到qq_name'''
for name in name_list:
qq_name = qq_name.append(pd.DataFrame([[df.loc[each,'qq'],name]],columns=columns))
return qq_name
'''调用函数输出qq_name,重置下索引。'''
qq_name = restore_qq_name(concat_name).reset_index(drop=True)
#打印下qq_name看下,效果如上:表1.
print(qq_name)
mysql查询语句:表1-表2
select qq, group_concat(name separator"_") name from qq_name group by qq;
有兴趣试试的同学,创表语句这里也给大家写好了:
# 创建表1:qq_name
create table qq_name(qq int, name varchar(10));
insert into qq_name values(123,"a"),(123,"b"),(123,"c"),(234,"f"),(234,"g");
# 创建表2:concat_name
create table concat_name select qq, group_concat(name separator"_") name from qq_name group by qq;
表2-表1的查询语句(不用存储过程),mysql大家知道怎么写的话,欢迎留言,先表以感谢~
逆向查询,hive中可以通过lateral view 与 explode函数实现
select qq,subview.view_name
from concat_name
-- subview是虚拟视图名称,view_name是虚拟字段名称,必须要加上;
lateral view explode(split(name,'_')) subview as view_name
- explode函数可以将一个array或者map展开,
- 其中explode(array)使得结果中将array列表里的每个元素生成一行;
- explode(map)使得结果中将map里的每一对元素作为一行,key为一列,value为一列;
- explode只能拆分单个字段
- lateral view explode 相当于一个拆分location字段的虚表,然后与原表进行关联
select explode(split(name,"_")) from concat_name -- 返回一列五行数据,值分别为a,b,c,f,g
select qq,explode(split(name,"_")) from concat_name -- 会报错