Scala 在spark中使用带有toCharArray的flatMap时找不到Encode[Char]
错误:错误:(20,27)找不到Char类型的编码器。需要隐式编码器[Char]在数据集中存储Char实例。导入spark.implicits支持基元类型(Int、String等)和产品类型(case类)。在将来的版本中将添加对序列化其他类型的支持。Scala 在spark中使用带有toCharArray的flatMap时找不到Encode[Char],scala,apache-spark,rdd,flatmap,Scala,Apache Spark,Rdd,Flatmap,错误:错误:(20,27)找不到Char类型的编码器。需要隐式编码器[Char]在数据集中存储Char实例。导入spark.implicits支持基元类型(Int、String等)和产品类型(case类)。在将来的版本中将添加对序列化其他类型的支持。 var data=names.flatMap(name=>name.getString(0).toCharArray.map(rec=>(rec,1)).rdd.reduce((x,y)=>('S',x.\u 2+y.\u 2))在执行flatMa
var data=names.flatMap(name=>name.getString(0).toCharArray.map(rec=>(rec,1)).rdd.reduce((x,y)=>('S',x.\u 2+y.\u 2))在执行
flatMap
和map
操作之前,可以先将数据帧转换为rdd:
import spark.implicits._
import org.apache.spark.sql.functions._
var names = Seq("ABC","XYZ").toDF("names")
var data = names.flatMap(name=>name.getString(0).toCharArray).map(rec=>
(rec,1)).rdd.reduce((x,y)=>('S',x._2 + y._2))
它将返回6,因为您只是在计算数据帧第一列中的字符数。不确定这是否是您期望的输出。您期望的输出是什么?你试图用代码做什么?我正在尝试获取所有字符的总和,我可以通过以下代码来实现:names.flatMap(name=>name.getString(0.split(“”)).map(rec=>(rec,1)).rdd.reduce((x,y)=>((SUM),x.\u2+y.\u2)),但是如果我尝试使用分割(“”),它会失败,因此,tring理解编码器存储库对快速响应的需求,但为什么它在数据帧中失败,为什么它需要在数据帧中转换。我能够获得所需的内容:我正在尝试获取所有字符的总和,我能够通过以下代码来实现:names.flatMap(name=>name.getString(0.split(“”)).map(rec=>(rec,1)).rdd.reduce((x,y)=>((SUM),x.\u 2+y.\u 2)),但是如果我尝试使用split(“”),它将失败,因此,tring理解数据集中编码器的这一需求,即必须对值进行序列化/编码。如果使用split,它将给出字符串,该字符串属于默认的Spark数据类型,可以进行编码,但如果使用
toCharArray
,则char不是默认的Spark数据类型,因此无法进行编码。
var data = names.rdd
.flatMap(name => name.getString(0).toCharArray)
.map(rec => (rec, 1))
.reduce((x, y) => ('S', x._2 + y._2))