spark自定义udf输入类型为array报错

定义udf如下

val list2string = udf { (style: Array[String], num: Array[Long]) =>

style.zip(num).map(t => t._1 + ":" + t._2).mkString("<br>")

}

输入为两个数组,输出为string

报错如下

Caused by: java.lang.ClassCastException:
scala.collection.mutable.WrappedArray$ofRef cannot be cast to
[Ljava.lang.String;

打印输入字段类型

root

|--
user_no: long (nullable = true)

|--
style_list: array (nullable = true)

|    |--
element: string (containsNull = true)

|--
styleNum_list: array (nullable = true)

|    |--
element: long (containsNull = true)

解决办法

更改udf输入为seq

val list2string = udf { (style: Seq[String], num: Seq[Long]) =>
   style.zip(num).map(t => t._1 + ":" + t._2).mkString("<br>")
}

原文地址:https://www.cnblogs.com/OS-BigData/p/8523607.html

时间: 2024-08-01 00:34:16

spark自定义udf输入类型为array报错的相关文章

单元测试时候使用[ClassInitialize]会该方法必须是静态的公共方法,不返回值并且应采用一个TestContext类型的参数报错的解决办法

using Microsoft.VisualStudio.TestTools.UnitTesting; 如果该DLL应用的是 C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PublicAssemblies\Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 版本为9.0.0.0 的话,则使用[ClassInitialize]会该方法必须是静态的公共方法,不返回值并且

自定义FreeBSD12镜像拉起ECS报错后的处理过程

今天帮客户做了个FreeBSD12的自定义镜像,使用自定义镜像后创建ECS后,缺发现机器启动异常,然后使用VNC去登录系统:1.将自定义的FreeBSD镜像上传到云平台的环境中后,使用自定义镜像创建虚拟机,无法正常访问,使用vnc远程机器登录,发现卡在mountroot状态:2.显示磁盘分区信息3.根据提示信息:ufs:/dev/da0s1a,然后根据实际分区情况输入ufs:/dev/vtbd0p24.修改/etc/fstab文件5.修改网卡配置文件6.编辑网卡配置文件(/etc/rc.conf

解决sqoop 导入oracle表时 --split-by参数为日期类型时的报错:ORA-01861: literal does not match format string

报错栈: 2017-06-08 18:46:13,422 INFO [main] org.apache.sqoop.mapreduce.db.DBRecordReader: Executing query: select "JFRQ","ZYH","FYKS","KSSE","YBJE","YPJE","ZJJE" from BSHIS."DEPCS_T_D

Spark 启动历史任务记录进程,报错 Logging directory must be specified解决

最近在自己电脑上装了Spark 单机运行模式,Spark 启动没有任何问题,可是启动spark history时,一直报错,错误信息如下: Spark assembly has been built with Hive, including Datanucleus jars on classpath Spark Command: /usr/local/java/jdk1.7.0_67/bin/java -cp ::/usr/local/spark/conf:/usr/local/spark/li

SpringMVC自动注入非String类型为空报错

SpringMVC的实现了在方法参数里写入实体类,和前台的name对应可以实现自动注入.但是某些Integer,Long,Data类型传入为空的时候就会报错. Integer,Long 类型可以在前台进行处理 或者 利用String 类型的别名 传入后台在进行处理: Data类型有两种比较简单的方式,一种就是String类型接收 自己进行转换 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");String data =

MySQL数据库储存bit类型的值报错

当我们储存bit类型的值时,不能直接写入数字 上图中的画圈部分就是bit类型,若是直接填入"1"或"0"等等就会报错,如下: 这时候,我们要看bit(M)的M值是多少,若M=4,则写成b'0001';若M=6,则写成b'000001'即可

Java 对象流(输入-输出)objectoutputstream序列化报错

报错:java.io.notserializableexception 解决方法:添加下面代码实现 对象类 1 package com.etc._07ObjectDemo; 2 3 import java.io.Serializable; 4 5 public class Person implements Serializable { 6 private int id; 7 private String name; 8 private String sex; 9 public int getI

access 数据库 按日期类型查询数据 报错!

<span style="font-size:18px;">select * from sv_JFVoucher where isDelete=0 and [date]>= '2015-1-20 0:00:00' and [date]<= '2015-1-20 0:00:00' order by id desc</span> 这条sql 语句在SqlServer08中执行是无错误的,可是在access数据库中执行就报错! 百度了一下,说把 <s

ElementUI的表单验证数字类型(输入了数据依然报错的原因)

https://www.cnblogs.com/oldli/articles/9557635.html 当需要验证的字段是数字类型的时候,需要使用 v-model.number 来绑定,否则验证的时候会当做字符串处理,结果就无法验证 <el-form-item label="可透支额:" prop="overdraw"> <el-input v-model.number="form.overdraw" type="nu