Scala 找到flatMap编译错误:TraversableOnce[String]必需:TraversableOnce[String]
编辑#2:这可能与内存有关。日志显示在堆外 是的,肯定与内存有关。基本上docker日志会报告所有 从java中输出堆外数据,但jupyter web笔记本不会将其传递给用户。相反,用户会遇到内核故障和偶尔的奇怪行为,比如代码编译不正确Scala 找到flatMap编译错误:TraversableOnce[String]必需:TraversableOnce[String],scala,apache-spark,Scala,Apache Spark,编辑#2:这可能与内存有关。日志显示在堆外 是的,肯定与内存有关。基本上docker日志会报告所有 从java中输出堆外数据,但jupyter web笔记本不会将其传递给用户。相反,用户会遇到内核故障和偶尔的奇怪行为,比如代码编译不正确 Spark 1.6,特别是docker run-d。。。。jupyter/all spark笔记本电脑 希望在约100万笔交易的文件中统计帐户 这很简单,可以不用spark完成,但我在尝试spark scala时遇到了一个奇怪的错误 输入数据类型为RDD[Et
Spark 1.6,特别是
docker run-d。。。。jupyter/all spark笔记本电脑
希望在约100万笔交易的文件中统计帐户
这很简单,可以不用spark完成,但我在尝试spark scala时遇到了一个奇怪的错误
输入数据类型为RDD[EthertTrans]
,其中EthertTrans
是一个自定义类型,包含一个事务:时间戳、往来账户以及以太中的事务值
class etherTrans(ts_in:Long, afrom_in:String, ato_in:String, ether_in: Float)
extends Serializable {
var ts: Long = ts_in
var afrom: String = afrom_in
var ato: String = ato_in
var ether: Float = ether_in
override def toString():String = ts.toString+","+afrom+","+ato+","+ether.toString
}
下一个函数解析为ok并以这种方式编写,因为以前的尝试抱怨数组[String]
或列表[String]
和可遍历一次[?]
之间的类型不匹配:
def arrow(e:etherTrans):TraversableOnce[String]=数组(e.afrom,e.ato)
但是,将此函数与flatMap一起使用以获取所有帐户的RDD[String]失败
val accts:RDD[String] = data.flatMap(arrow)
Name: Compile Error
Message: :38: error: type mismatch;
found : etherTrans(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC) => TraversableOnce[String]
required: etherTrans(in class $iwC)(in class $iwC)(in class $iwC)(in class $iwC) => TraversableOnce[String]
val accts:RDD[String] = data.flatMap(arrow)
^
StackTrace:
在terminal spark shell 1.6.0/spark 2.10.5中为他工作,Scala 2.11.7和spark 1.5.2也可以工作。我认为您应该切换到用例类,它应该可以正常工作。使用“常规”类,序列化它们时可能会出现奇怪的大小写问题,而且看起来您需要的只是值对象,所以大小写类看起来更适合您的用例 例如:
case class EtherTrans(ts: Long, afrom: String, ato: String, ether: Float)
val source = sc.parallelize(Array(
(1L, "from1", "to1", 1.234F),
(2L, "from2", "to2", 3.456F)
))
val data = source.as[EtherTrans]
val data = source.map { l => EtherTrans(l._1, l._2, l._3, l._4) }
def arrow(e: EtherTrans) = Array(e.afrom, e.ato)
data.map(arrow).take(5)
/*
res3: Array[Array[String]] = Array(Array(from1, to1), Array(from2, to2))
*/
data.map(arrow).take(5)
// res3: Array[Array[String]] = Array(Array(from1, to1), Array(from2, to2))
如果需要,您可以创建一些方法/对象来生成案例类。
如果您的逻辑实际上不需要“toString”方法,而只需要“presentation”方法,请将其排除在case类之外:在存储If或显示之前,您始终可以使用映射操作添加它
此外,如果您使用的是Spark 1.6.0或更高版本,则可以尝试使用DataSet API,大致如下所示:
val data = sqlContext.read.text("your_file").as[EtherTrans]
对我来说很好。你测试过这个笔记本吗?没有。让我看看docker容器中是否有一个火花壳…@zero323 docker容器中有一个火花壳,但我从中得到一些奇怪的内存问题,只是读取文本数据。你是如何测试这个的?您是在spark shell中测试编译问题还是使用编译器测试编译问题?如果您正在运行它,您是在对我转储的数据调用sc.parallelize,还是其他什么?当然,您不必运行它来测试编译,只需在spark shell中运行即可。类似这样的东西:
val-rdd=sc.parallelize(Seq((1L,“foo”,“bar”,1)).map{case(ts,fr,to,et)=>new-etherTrans(ts,fr,to,et)}rdd.flatMap(箭头)。collect
我认为编译器不会抱怨,但让我检查一下。我怀疑在某种程度上类定义可以重新编译,但不能。
case class EtherTrans(ts: Long, afrom: String, ato: String, ether: Float)
val source = sc.parallelize(Array(
(1L, "from1", "to1", 1.234F),
(2L, "from2", "to2", 3.456F)
))
val data = source.as[EtherTrans]
val data = source.map { l => EtherTrans(l._1, l._2, l._3, l._4) }
def arrow(e: EtherTrans) = Array(e.afrom, e.ato)
data.map(arrow).take(5)
/*
res3: Array[Array[String]] = Array(Array(from1, to1), Array(from2, to2))
*/
data.map(arrow).take(5)
// res3: Array[Array[String]] = Array(Array(from1, to1), Array(from2, to2))
val data = sqlContext.read.text("your_file").as[EtherTrans]