Spark高效行查询(透视功能):实现动态透视并筛选数据的方法
动态透视长格式DataFrame并筛选数据
问题背景
现有如下长格式DataFrame:
|sno |id |value | --------|---------------|------------| 1 |Cnt_id |1966 | 1 |Active_Ind |FALSE | 1 |Report_Status |Active | 1 |New_Ind |FALSE | 1 |State |OA | 2 |Cnt_id |1223 | 2 |Active_Ind |FALSE | 2 |Report_Status |Inactive | 2 |New_Ind |FALSE | 2 |State |MS | 3 |Cnt_id |112 | 3 |Active_Ind |TRUE | 3 |Report_Status |Inactive | 3 |New_Ind |TRUE | 3 |State |US |
需要实现类似SQL语句 select * from table where Active_Ind='FALSE' 的查询,得到宽格式结果:
---------------------------------------------------------------| sno |Cnt_id |Active_Ind |Report_Status |New_Ind |State | ---------------------------------------------------------------| 1 |1966 |FALSE |Active |FALSE |OA | 2 |1223 |FALSE |Inactive |FALSE |MS |
常规透视需要硬编码列名,现寻求动态实现方式,可按需指定列进行动态透视与筛选。
动态实现方案(Python Pandas)
步骤1:长格式转宽格式
无需硬编码列名,直接用pivot方法自动识别所有字段生成宽表:
import pandas as pd # 构造示例长格式数据 data = [ [1, 'Cnt_id', '1966'], [1, 'Active_Ind', 'FALSE'], [1, 'Report_Status', 'Active'], [1, 'New_Ind', 'FALSE'], [1, 'State', 'OA'], [2, 'Cnt_id', '1223'], [2, 'Active_Ind', 'FALSE'], [2, 'Report_Status', 'Inactive'], [2, 'New_Ind', 'FALSE'], [2, 'State', 'MS'], [3, 'Cnt_id', '112'], [3, 'Active_Ind', 'TRUE'], [3, 'Report_Status', 'Inactive'], [3, 'New_Ind', 'TRUE'], [3, 'State', 'US'], ] df_long = pd.DataFrame(data, columns=['sno', 'id', 'value']) # 动态透视:以sno为分组键,id的唯一值自动作为列 df_wide = df_long.pivot(index='sno', columns='id', values='value').reset_index() # 清理列名的多级索引标识 df_wide.columns.name = None
步骤2:执行筛选操作
直接对宽表进行条件筛选,逻辑与SQL一致:
# 筛选Active_Ind为'FALSE'的行 result = df_wide[df_wide['Active_Ind'] == 'FALSE'] # 可选:调整列顺序匹配目标输出 result = result[['sno', 'Cnt_id', 'Active_Ind', 'Report_Status', 'New_Ind', 'State']] print(result)
输出结果
sno Cnt_id Active_Ind Report_Status New_Ind State 0 1 1966 FALSE Active FALSE OA 1 2 1223 FALSE Inactive FALSE MS
动态性说明
- 无需提前指定所有列名,
pivot会自动识别id列的所有唯一值作为宽表列 - 若后续
id列新增字段,代码无需修改即可自动适配 - 筛选条件可灵活调整,比如改为
Active_Ind='TRUE'或其他字段的条件
内容的提问来源于stack exchange,提问作者Sri Bharath
相关产品推荐
相关产品推荐

