本例,真正理解PQ的分界线。
在文章中,很少讲PowerQuery,也就是PowerBI的查询编辑,因为在实际应用中,确实没有碰到特别复杂的情况,原因有三: 1.使用PowerBI应减少在导入数据环节的复杂数据转换处理,这会拖慢速度,而且影响非常明显,所以,应该使用已经整理好的数据作为PowerBI的数据源,在这种模式下,PowerBI使用PQ快速简单筛选下数据就可以进行建模工作,而建模将处理海量数据的运算。 1.使用PowerBI的PowerQuery做非常复杂的数据转换工作,要求数据量应该是小的,例如:小于10W行。 1.即使是使用PowerBI的PowerQuery做非常复杂的数据转换工作,也有几个不写代码的重要套路。
因此,PowerBI中的PowerQuery与PowerBI的DAX不同,DAX需要真正写代码,而PowerQuery却可以按套路来操作,尽量不写或少写代码。今天的案例就是分享几个套路中的一个重要套路:模板函数法(自己命名,如有雷同,纯属巧合)。
我们的目标是:不写代码,胜似代码~ 来看看。
从电影数据案例来理解模板函数法
在此前的文章中:PowerBI 零代码智能网抓中国电影大数据让人惊叹,这里不再重复之前的说明,但从另一个角度来看待这件事,为了获得2008年到2018年的每年电影票房数据,我们用分治法的思维,将问题描述为:
- 先获得处理某年电影票房数据的能力,记作:fnGetMovieData。
- 构建一个年份表,对每一行,应用 fnGetMovieData 函数得到各年数据。
- 展开合并上述第二步的数据。(完)
整个结构如下:
其中,我们使用MovieSample作为种子以及Year作为参数来构建这个模板函数,然后整体再获得Movie的数据。整个过程几乎不涉及任何代码的编写。这里最关键的一步就是创建模板函数,如下:
这里的巧妙之处在于:参数,创建函数,与后续的调用自定义函数融为一体,是PowerBI中PowerQuery的正统操作。
从多个文件提取并处理数据来理解模板函数法
该案例来自社区伙伴的实际问题模拟。首先显示下正确提问问题的姿势:
下面来看如何一行代码不写得处理这个问题。
我们仍然需要按照分治法的思维来思考这个事情:
- 先获得处理某个单文件的能力,记为:fnTransformExcelFile。
- 获取文件表,对每一行,应用 fnTransformExcelFile 函数得到每个文件处理后的结果。
- 展开合并上述第二步的数据。(完)
这和处理电影数据的案例,如出一辙,思路完全一样。在这里的分享,展示这两个案例,更多地给大家启发一种举一反三的思维以及分治法的通用模式,这些需要用PowerBI 的 PQ 深度套路来落地。
对单个文件进行逆透视在PowerBI的PowerQuery中非常简单,然后把这个能力需要模板化,形成函数。
这里的特别之处在于,由于处理的主体是文件,是一个二进制文件,所以可以用到二进制文件作为参数,这在PowerBI的PowerQuery里还真有:
因为我们人工是无法输入二进制数据,所以必须可以留空以允许我们创建一个二进制的参数。
但用这种方法来制作函数模板,会出现错误:
这个错误是由于参数不能正确生成二进制文件,导致会报错,但该模板函数本身又没有错。
WHAT??!! Are You Kidding Me?!!
是的,您没听错:这里创建了一个报了错的没错的函数,这里需要您有强大的神经来理解这个很绕的逻辑。
然后,就轻而易举地完成了后面的事情。
本文更多展示思路,在细节上的忽略不影响整体思维和结构。可以案例文件为准。
总结
PowerBI在设计PowerQuery的时候可以明显发现,PowerQuery编辑器的每次改造都是希望可以对应于PowerQuery本身代码的功能去完善。而参数和创建函数的存在也确实是为了创建带参数的函数而存在的。我们通过两个案例可以看出:创建模板函数的能力将参数,创建函数,新建列,调用自定义函数,用单元格作为函数参数融为一体。通过模板函数与分治法的结合可以处理很多的场景,因此这不失为一项PowerBI中PowerQuery的重要套路。