Spark:递归“ ArrayType Column => ArrayType Column”功能

时间:2019-01-30 16:39:57

标签: scala apache-spark apache-spark-sql

我正在尝试构建一个火花函数,该函数以递归方式重写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能够更好地优化它们(据我所知)。

1 个答案:

答案 0 :(得分:2)

那是行不通的,因为这里没有有意义的停止条件。 when / otherwise不是语言级别控制流程块(因此不能中断执行),并且该函数将永远永久递归。

实际上,即使在任何SQL评估上下文之外的空数组中,它也不会停止:

rewriteArrayCol(array())

此外,您的假设是不正确的。跳过了您的代码将数据反序列化两次(每次对arrayHeadarrayTail进行反序列化)的事实,这比仅调用udf一次(尽管使用slice可以避免)更糟糕。复杂的表达式有其自身的问题,其中之一就是代码生成的大小限制。

请不要失望-已经有一个有效的解决方案-transform。参见How to use transform higher-order function?