云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

数据库_阿刁张韶涵百度云_怎么申请

小七 141 0

在ApacheSpark2.4中为复杂数据类型引入了新的内置函数和高阶函数

在数据库里试试这个笔记本ApacheSpark2.4引入了29个新的内置函数来处理复杂类型(例如数组类型),包括高阶函数。在Spark 2.4之前,对于直接操作复杂类型,有两种典型的解决方案:1)将嵌套结构分解成单独的行,并应用一些函数,然后重新创建结构;2)构建用户定义函数(UDF)。相比之下,新的内置函数可以直接操作复杂类型,而高阶函数可以使用匿名lambda函数(类似于udf)操作复杂值,但性能要好得多。在这个博客中,通过一些例子,我们将展示一些新的内置函数以及如何使用它们来操作复杂的数据类型。典型解决方案让我们先用下面的例子回顾一下典型的解决方案。选项1–爆炸和收集我们使用explode将数组分解成单独的行并计算val+1,然后使用collect_list重新构造数组,如下所示:选择id,收集列表(val+1)作为val从(选择id,分解(val)为val从输入端(tbl)x按id分组这很容易出错,而且效率低下,原因有三。首先,我们必须努力确保重新收集的数组是从原始数组中完全生成的,方法是按唯一键对它们进行分组。其次,我们需要一个groupby,这意味着一个shuffle操作;shuffle操作不能保证从原始数组重新收集数组的元素顺序。最后,它是昂贵的。选项2–用户定义函数接下来,我们使用Scala UDF,它接受Seq[Int]并在其中的每个元素上添加1:def addOne(值:Seq[Int]):Seq[Int]={值.map(值=>值+1)}val plusOneInt=spark.udf.register("plusOneInt",添加一个(:Seq[Int]):Seq[Int])或者我们也可以使用Python UDF,然后:从输入中选择id,plusOneInt(VAL)作为VAL这样做更简单、更快速,而且不存在正确性陷阱,但它可能仍然效率低下,因为将数据序列化为Scala或Python可能代价高昂。你可以在我们发布的博客中的笔记本上看到这些例子,并尝试它们。新的内置函数让我们看看直接操作复杂类型的新内置函数。笔记本列出了每个功能的例子。每个函数的签名和参数用它们各自的类型T或U注释,表示为数组元素类型,K、V表示为映射和值类型。高阶函数为了进一步操作数组和映射类型,我们对匿名lambda函数和高阶函数使用了SQL中已知的语法,以lambda函数作为参数。lambda函数的语法如下:参数->函数体(参数1,参数2,…)->函数体符号->的左侧定义参数列表,右侧定义函数体,该函数体可以使用其中的参数和其他变量来计算新值。匿名Lambda函数变换让我们看看使用匿名lambda函数的transform函数的示例。这里我们有一个包含3列的数据表:一个键作为整数;一个数组的值是整数;嵌套的值是数组的整数。钥匙价值观嵌套的_值1[1,2,3][[1,2,3],[],[4,5]]执行以下SQL时:从数据中选择转换(值,元素->元素+1);transform函数在数组上迭代,并应用lambda函数,为每个元素添加1,然后创建一个新数组。我们还可以在lambda函数中使用参数之外的其他变量,例如:key,它来自表的列外部上下文:从数据中选择转换(值,元素->元素+键);如果要操作深度嵌套的列(如本例中的嵌套_值),可以使用嵌套lambda函数:选择变换(嵌套的_值,arr->转换(arr,元素->元素+键+大小(arr)))来自数据;可以在内部lambda函数中使用key和arr,这些函数来自外部上下文、表的列和外部lambda函数的参数。注意,您可以在笔记本中看到与它们的典型解决方案相同的示例,其他高阶函数的示例也包含在内置函数的笔记本中。结论Spark 2.4引入了24个新的内置函数,如array_union、array_max/min等,以及5个用于操作复杂类型的高阶函数,如transform、filter等。整个名单和他们的例子都在这本笔记本里。如果您有任何复杂的值,请考虑使用它们,并让我们知道任何问题。我们要感谢Apache Spark社区的贡献者Alex Vayda、Bruce Robbins、Dylan Guedes、Florent Pepin、H Lu、Huaxin Gao、Kazuaki Ishizaki、Marco Gaido、Marek Novotny、Neha Patil、Sandeep Singh和许多其他人。阅读更多要了解有关高阶和内置函数的更多信息,请参阅以下参考资料:试试随附的笔记本阅读之前关于高阶函数的博客观看Spark+AI欧洲峰会关于高阶函数的讨论免费试用Databricks。今天就开始吧