Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在spark中使用带有toCharArray的flatMap时找不到Encode[Char]_Scala_Apache Spark_Rdd_Flatmap - Fatal编程技术网

Scala 在spark中使用带有toCharArray的flatMap时找不到Encode[Char]

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

错误:错误:(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))

在执行
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))