|
本帖最后由 大寒123 于 2022-9-16 17:21 编辑
数据保密也不好上附件,图片也得一顿抹,尝试描述清楚。
一个工作任务,想来想去还是做成模型后续更新数据源自动更新结果合适,学习了一个月的PowerQuery开始做,就差一点,就能完成了,然后卡了两周……
数据源是100万行×83列的,从库里导出的CSV文件(没有数据库权限,为了完成工作请有权限的同事帮忙导出的)。
测试模型,只选取了25万行数据(CSV就只有25万行,80列)导入PQ处理,以下描述基于这25万行数据。
一些整理和清洗过程不提。
小目标:要给数据源增加一列信息,匹配关系是一对多的,需要判断多个匹配项里,哪一个是需要的,增加此列信息后,导入到PowerPivot。
Excel处理倒是简单,可惜数据量太大处理起来太慢,以下为我的PQ思路:
1、通过合并查询,源表上新增了一列格式为table的数据,即图上“结算口径”一列,每行的table可能1行信息都没有,也可能有多行;
每行的table其中一列为“口径字段”,都是XX日期,内容与源表的标题一致,分别对应源表的4列不同的日期;
2、给每行的table增加一列“计算日期”,根据“口径字段”的内容,获取源表当前行数据里,列标题与“口径字段”相符的日期:
——————————————————————————————
Table.ReplaceValue(合并的查询1,each [结算口径],
each [索引],
(x,y,z)=>Table.AddColumn(y,"计算日期",(n)=> DateTime.Date(Record.Field(Table.SelectRows(合并的查询1,each [索引]=z){0},n[口径字段]))),
{"结算口径"})
———————————————————————————————
3、给每行的table增加一列“日期判断”,在每行table里,判断第2步获取的“计算日期”是否在有效期里,符合返回1,否则返回0,故结果可能为都是0,都是1,或者0和1都有。
———————————————————————————————
子表判断口径是否有效=Table.TransformColumns(子表加口径,{"结算口径",each Table.AddColumn(_,"日期判断",
each if (try _[计算日期])[HasError] or _[计算日期] is null then 0
else if _[计算日期] >= _[有效期始] and _[计算日期] <= _[有效期止] then 1
else 0)})
———————————————————————————————
4、源表新增一列获取需要的信息,每一行table的日期判断这一列,根据第1个“1”所在的坐标,获取对应的“结算口径”的数据,如果没有1,返回“无匹配规则”。
———————————————————————————————
返回匹配的结算口径=Table.AddColumn(子表判断口径是否有效,"口径",(x)=> try x[结算口径][结算口径]{Table.PositionOfAny(x[结算口径],{[日期判断=1]},0,each x[结算口径][日期判断])} otherwise "无匹配规则")
或是:
返回匹配的结算口径=Table.AddColumn(子表判断口径是否有效,"口径",(x)=> try x[结算口径][结算口径]{List.PositionOf(x[结算口径][日期判断],1)} otherwise "无匹配规则")
———————————————————————————————
现在问题在第4步,可以计算,得出的结果也是对的,25万行数据大约1分钟计算完成,
但计算时,右下角一致闪烁来自源表的多少MB,关联合并查询的表也在显示,显示过程里源CSV不断增加,把原本90M的文件,内容一下子增加到了400多兆:
这一步之前,数据都可以顺利导入PP,第4步运算完成后,就无法导入PP了,上网查询判断,是因为PQ导入PP有2G的内存限制。
怎么才能获取到目标数据,还不改变文件大小,顺利导入PP呢?求前辈们解答,请喝奶茶!请吃饭也行!
|
-
|