Spark Scala中如何将列表元素拆分为指定数量的列?
解决Emp列表拆分为3列的需求
嘿,这个拆分需求我很熟!你需要把每个Emp对应的元素列表按每3个一组拆分,每组对应一行(重复EmpID),不足3个的列留空。下面给你两种实用的实现方式:
方式一:用Python处理内存数据
如果是在Python里直接处理内存中的列表数据,按固定长度切片分组就能搞定:
首先定义你的原始数据:
emp_data = { 101: ['a', 'b', 'c', 'd', 'e'], 102: ['q', 'w', 'e'], 103: ['z', 'x', 'w', 't', 'e', 'q', 's'] }
然后编写拆分逻辑并输出结果:
# 打印表头 print("Emp col1 col2 col3") for emp_id, elements in emp_data.items(): # 按每3个元素为一组拆分列表 for start_idx in range(0, len(elements), 3): # 取出当前组元素,不足3个的用空字符串补全 current_group = elements[start_idx:start_idx+3] + [''] * (3 - len(elements[start_idx:start_idx+3])) # 格式化输出保证列对齐 print(f"{emp_id} {' '.join(current_group)}")
运行后就能得到你想要的结果:
Emp col1 col2 col3 101 a b c 101 d e 102 q w e 103 z x w 103 t e q 103 s
方式二:用SQL(以PostgreSQL为例)查询数据库
如果数据存在数据库里,用数组切片加序列生成就能实现:
假设你有一张emp表,结构和测试数据如下:
CREATE TABLE emp ( emp_id INT, elements TEXT[] ); INSERT INTO emp VALUES (101, ARRAY['a','b','c','d','e']), (102, ARRAY['q','w','e']), (103, ARRAY['z','x','w','t','e','q','s']);
执行下面的查询语句,就能得到目标格式的结果:
SELECT emp_id, COALESCE(elements[i], '') AS col1, COALESCE(elements[i+1], '') AS col2, COALESCE(elements[i+2], '') AS col3 FROM emp, generate_series(1, array_length(elements, 1), 3) AS i ORDER BY emp_id, i;
这里generate_series生成每组的起始索引,array_length获取数组长度,COALESCE把空值替换成空字符串,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者rad
相关产品推荐
相关产品推荐

