我正在尝试构建一个火花函数,该函数以递归方式重写ArrayType列:
.wrapper{
margin: 100px auto;
max-width: 960px;
.stage{
list-style: none;
padding: 0;
.scene {
width: 260px;
height: 400px;
margin: 30px;
float: left;
perspective: 1000px;
}
}
}
不幸的是,我不断出现stackoverflow。我认为缺少该功能的一个方面是它不是尾递归的。即整个'when()。otherwise()'块与'if else'块不同。话虽这么说,该函数当前应用于什至很小的数据帧时也会引发stackoverflow(因此,我认为它的错误肯定不仅仅是不尾递归)。
我无法在线找到类似功能的任何示例,因此我想在这里提出。我能够找到的Column => Column函数的唯一实现是非常非常简单的实现,对于该用例没有帮助。
注意:通过使用UDF,我可以实现上述功能。我尝试创建Column => Column函数的原因是因为与UDF相比,Spark能够更好地优化它们(据我所知)。
答案 0 :(得分:2)
那是行不通的,因为这里没有有意义的停止条件。 when
/ otherwise
不是语言级别控制流程块(因此不能中断执行),并且该函数将永远永久递归。
实际上,即使在任何SQL评估上下文之外的空数组中,它也不会停止:
rewriteArrayCol(array())
此外,您的假设是不正确的。跳过了您的代码将数据反序列化两次(每次对arrayHead
,arrayTail
进行反序列化)的事实,这比仅调用udf
一次(尽管使用slice可以避免)更糟糕。复杂的表达式有其自身的问题,其中之一就是代码生成的大小限制。
请不要失望-已经有一个有效的解决方案-transform
。参见How to use transform higher-order function?