spark structstream 性能(sparkudf使用缓存数据吗)

技术Spark UDF变长参数的方法是什么这篇文章主要介绍“Spark UDF变长参数的方法是什么”,在日常操作中,相信很多人在Spark UDF变长参数的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操

本文主要介绍“什么是火花UDF变长参数法”。在日常操作中,相信很多人对Spark UDF变长参数的方法有所怀疑。边肖查阅了各种资料,整理出简单易用的操作方法,希望能帮你解答“火花UDF变长参数的方法是什么”的疑惑!接下来,请和边肖一起学习!

引子

变量参数对我们来说并不陌生,这是我们用Java写的。

Public void varargs(字符串.这是我们用Scala写的。

defargs(cols : string *): string在Spark中,很多时候我们都有自己的业务逻辑,现成的功能无法满足我们的需求。当我们需要处理同一行中的多列,并通过自己的逻辑将它们组合成一列时,可变长度参数及其变体的实现可以帮助我们。

但是,在Spark UDF中,我们不能使用变长参数来传输值,但是本文从变长参数开始的原因是需求从它开始,通过转换它,我们可以使用变长参数或Seq类型来接收参数。

以下演示由火花壳公司完成。以下三种方法可以实现多列参数传输,它们是

可变参数(接受数组类型)

Seq类型参数(接受数组类型)

行类型参数(接受结构类型)

变长参数类型的UDF

定义UDF方法

defmyncatvarargs(sep : string,cols 3360 string *): string=cols . filter(_!=null)。注册UDF函数

因为可变长度参数只能由方法定义,所以这里使用一些应用函数来转换它们。

你可以看到udf的定义如下

Userdefinedfunction(函数2,字符串类型,list(字符串类型,ArrayType(字符串类型,true)),即变长参数转换为数组类型,函数只包含两个参数,所以变长参数列表也可以看作是不可用的。

变长参数列表传值

我们构建一个数据框架如下

Valdf=sc。并行(数组((' aa ',' bb ',' cc '),(' DD ',' ee ',' ff '))。todf ('a ',' b ',' c ')然后直接在多个String中传递给myConcatVarargsUDF。

DF。选择(myncatvarargsudf(lit('-'))、col ('a ')、col ('b ')、col ('c ')。显示结果中出现以下错误

Java . lang . class castexception : anon fun $ 1 cannotbecasttoscala . function 4可以看出,使用变长参数表是不支持Spark的,它会被识别为四个参数的函数,而UDF定义为两个参数的函数而不是四个参数!

变换:使用array()转换做第二个参数

我们使用Spark提供的Array()函数将参数转换为数组类型。

Df。选择(myconcat Varargsudf (lit ('-'))、数组(col ('a ')、col ('b ')、col ('c '))。显示结果如下

- |UDF(-,数组(A,B,C))| - |n

bsp;         aa-bb-cc| |           dd-ee-ff| +-------------------+

由此可以看出,使用变长参数构造的UDF方法,可以通过构造Array的方式传参,来达到多列合并的目的。

使用Seq类型参数的UDF

上面提到,变长参数***被转为ArrayType,那不禁要想我们为嘛不使用Array或List类型呢?

实际上在UDF里,类型并不是我们可以随意定义的,比如使用List和Array就是不行的,我们自己定义的类型也是不行的,因为这涉及到数据的序列化和反序列化。

以Array/List为示例的错误

下面以Array类型为示例

定义函数

val myConcatArray = (cols: Array[String], sep: String) => cols.filter(_ != null).mkString(sep)

注册UDF

val myConcatArrayUDF = udf(myConcatArray)

可以看到给出的UDF签名是

UserDefinedFunction(<function2>,StringType,List())

应用UDF

df.select(myConcatArrayUDF(array(col("A"), col("B"), col("C")), lit("-"))).show

会发现报错

scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String

同样List作为参数类型也会报错,因为反序列化的时候无法构建对象,所以List和Array是无法直接作为UDF的参数类型的

以Seq做参数类型

定义调用如下

val myConcatSeq = (cols: Seq[Any], sep: String) => cols.filter(_ != null).mkString(sep)  val myConcatSeqUDF = udf(myConcatSeq)  df.select(myConcatSeqUDF(array(col("A"), col("B"), col("C")), lit("-"))).show

结果如下

+-------------------+ |UDF(array(A,B,C),-)| +-------------------+ |           aa-bb-cc| |           dd-ee-ff| +-------------------+

使用Row类型参数的UDF

我们可以使用Spark functions里struct方法构造结构体类型传参,然后用Row类型接UDF的参数,以达到多列传值的目的。

def myConcatRow: ((Row, String) => String) = (row, sep) => row.toSeq.filter(_ != null).mkString(sep)  val myConcatRowUDF = udf(myConcatRow)  df.select(myConcatRowUDF(struct(col("A"), col("B"), col("C")), lit("-"))).show

可以看到UDF的签名如下

UserDefinedFunction(<function2>,StringType,List())

结果如下

+--------------------+ |UDF(struct(A,B,C),-)| +--------------------+ |            aa-bb-cc| |            dd-ee-ff| +--------------------+

使用Row类型还可以使用模式提取,用起来会更方便

row match {   case Row(aa:String, bb:Int) => }

***

对于上面三种方法,变长参数和Seq类型参数都需要array的函数包装为ArrayType,而使用Row类型的话,则需要struct函数构建结构体类型,其实都是为了数据的序列化和反序列化。三种方法中,Row的方式更灵活可靠,而且支持不同类型并且可以明确使用模式提取,用起来相当方便。

而由此我们也可以看出,UDF不支持List和Array类型的参数,同时 自定义参数类型  如果没有混合Spark的特质实现序列化和反序列化,那么在UDF里也是 无法用作参数类型 的。当然,Seq类型是可以 的,可以接多列的数组传值。

此外,我们也可以使用柯里化来达到多列传参的目的,只是不同参数个数需要定义不同的UDF了。

到此,关于“Spark UDF变长参数的方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/145790.html

(0)

相关推荐

  • m是什么,“S”和“M”是什么意思

    技术m是什么,“S”和“M”是什么意思S是施虐症:指中世纪法国一个侯爵叫做萨德m是什么,他在生活中喜欢对女性施加虐待,在他的作品中有大量性变态行为的描述,所以后来的学者把主动的虐待症,也就是喜欢虐待别人,命名为萨德现象(

    生活 2021年10月23日
  • 光猫是什么样子的,怎么看光猫是千兆还是百兆

    技术光猫是什么样子的,怎么看光猫是千兆还是百兆看光猫是千兆还是百兆有这么两种方法,一种看光猫网络接口旁边的标记光猫是什么样子的;一种是查看光猫说明书。下面分开来讲一下。1、光猫网络接口类型光猫也叫光调制解调器、光纤猫等,

    生活 2021年10月26日
  • 如何防止人为误操作MySQL数据库

    技术如何防止人为误操作MySQL数据库这篇文章主要介绍“如何防止人为误操作MySQL数据库”,在日常操作中,相信很多人在如何防止人为误操作MySQL数据库问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

    攻略 2021年10月23日
  • Redis面试常见问题有哪些

    技术Redis面试常见问题有哪些本篇内容主要讲解“Redis面试常见问题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis面试常见问题有哪些”吧!1. 什么是缓存

    攻略 2021年11月18日
  • python和sqlite3数据库如何实现简单登陆注册功能

    技术python和sqlite3数据库如何实现简单登陆注册功能这篇文章将为大家详细讲解有关python和sqlite3数据库如何实现简单登陆注册功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后

    攻略 2021年12月4日
  • 怎样进行debian apt mysql无密码安装

    技术怎样进行debian apt mysql无密码安装怎样进行debian apt mysql无密码安装,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能

    攻略 2021年11月30日