当前位置: 首页 > 知识库问答 >
问题:

找到flatMap编译错误:TraversableOnce[String]必需:TraversableOnce[String]

赵奕
2023-03-14

编辑#2:这可能与记忆有关。日志正在堆外显示。

是的,肯定与记忆有关。基本上docker日志会报告java堆外的所有速度,但jupyter web笔记本不会将其传递给用户。相反,用户会遇到内核故障和偶尔的奇怪行为,比如代码编译不正确。

Spark 1.6,尤其是docker run-d。。。。jupyter/all spark笔记本电脑

希望统计约100万笔交易中的账户。

这很简单,它可以在没有火花的情况下完成,但是我在尝试火花scala时遇到了一个奇怪的错误。

输入数据类型为RDD[etherTrans],其中etherTrans是包含单个事务的自定义类型:时间戳、从帐户和到帐户以及在以太网中处理的值。

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    
}

数据:RDD[etherTrans]看起来没问题:

data.take(10).foreach(println)

etherTrans(1438918233,0xa1e4380a3b1f749673e270229993ee55f35663b4,0x5df9b87991262f6ba471f09758cde1c0fc1de734,3.1337E-14)
etherTrans(1438918613,0xbd08e0cddec097db7901ea819a3d1fd9de8951a2,0x5c12a8e43faf884521c2454f39560e6c265a68c8,19.9)
etherTrans(1438918630,0x63ac545c991243fa18aec41d4f6f598e555015dc,0xc93f2250589a6563f5359051c1ea25746549f0d8,599.9895)
etherTrans(1438918983,0x037dd056e7fdbd641db5b6bea2a8780a83fae180,0x7e7ec15a5944e978257ddae0008c2f2ece0a6090,100.0)
etherTrans(1438919175,0x3f2f381491797cc5c0d48296c14fd0cd00cdfa2d,0x4bd5f0ee173c81d42765154865ee69361b6ad189,803.9895)
etherTrans(1438919394,0xa1e4380a3b1f749673e270229993ee55f35663b4,0xc9d4035f4a9226d50f79b73aafb5d874a1b6537e,3.1337E-14)
etherTrans(1438919451,0xc8ebccc5f5689fa8659d83713341e5ad19349448,0xc8ebccc5f5689fa8659d83713341e5ad19349448,0.0)
etherTrans(1438919461,0xa1e4380a3b1f749673e270229993ee55f35663b4,0x5df9b87991262f6ba471f09758cde1c0fc1de734,3.1337E-14)
etherTrans(1438919491,0xf0cf0af5bd7d8a3a1cad12a30b097265d49f255d,0xb608771949021d2f2f1c9c5afb980ad8bcda3985,100.0)
etherTrans(1438919571,0x1c68a66138783a63c98cc675a9ec77af4598d35e,0xc8ebccc5f5689fa8659d83713341e5ad19349448,50.0)

下一个函数解析ok并以这种方式编写,因为之前的尝试抱怨Array[String]List[String]TraversableOnce[?]之间的类型不匹配

def箭头(e: etherTrans): TraversableOne[String]=Array(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: 

请确保向右滚动,看到它抱怨TraversableOnce[String]TraversableOnce[String]

这一定是一个相当常见的问题,因为在生成对列表中出现了更明显的类型不匹配,虽然没有足够的上下文,但在我有一个Scala列表中建议,如何获得可遍历的一次?。

这是怎么回事?

编辑:上面报告的问题没有出现,代码在旧的Spark shell中运行良好,Spark 1.3.1在docker容器中独立运行。在使用jupyter/all-Spark笔记本docker容器的Spark 1.6 scala jupyter环境中运行时会产生错误。

@zero323还表示,这个玩具示例:


 val rdd = sc.parallelize(Seq((1L, "foo", "bar", 1))).map{ case (ts, fr, to, et) => new etherTrans(ts, fr, to, et)} 
 rdd.flatMap(arrow).collect

为他工作的终端火花外壳1.6.0/火花2.10.5,也Scala 2.11.7和火花1.5.2工作。


共有1个答案

阎宝
2023-03-14

我认为您应该切换到用例类,它应该可以正常工作。使用“常规”类,序列化它们时可能会出现奇怪的case问题,而且看起来您只需要值对象,所以case类看起来更适合您的用例。

举个例子:

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或显示之前,你总是可以用map操作添加它。

此外,如果您使用的是Spark 1.6.0或更高版本,您可以尝试使用DataSet API,大致如下所示:

val data = sqlContext.read.text("your_file").as[EtherTrans]

https://databricks.com/blog/2016/01/04/introducing-spark-datasets.html

 类似资料:
  • 问题内容: 当代码到达递归调用增量时,我收到错误找不到符号,我不知道为什么?这是增量代码。任何帮助将不胜感激。 编辑:我真的是Java的新手,所以可以做的答案越基本越好。好的,所以我收到的错误是:BigNatural.java.35:找不到符号符号方法增量()位置:类java.lang.String temp.increment() 并在此处清除所有其他问题,是整个代码。 }公共类BigNatur

  • 问题内容: 嘿,我刚开始我的第一本Java编程书籍,所以这应该很容易解决。弄乱我对条件句的新知识,发现标题错误。 这是代码: 当我尝试编译时: 问题答案: 错误消息告诉您变量“输入”在您的作用域中不存在。您可能想使用Scanner对象,但将其命名为“ x”,而不是“ input”。 应该修复它。

  • 我用的是Spring靴2。在多java项目中。 我尝试构建我的主库(还没有java文件) 在我的gradle/wrapper中,我有 我得到的错误 原因:org.gradle.api.internal.plugins.PluginApplicationException:无法应用插件[id'org.springframework.boot'] 原因:org.gradle.api。GradleExc

  • 编辑:我把单引号改成双引号,短绒没有抱怨。 我把这个放到jsonlint.com,我得到了这个错误: 其他json棉绒也有类似的结果。最初,数值是空的,所以我用单引号将它们括起来,以消除< code>jq错误: 但我还是为JQ买的。 我没有看到任何未定义的键,我错过了什么? 我还在网上看到一篇参考文章,不允许对密钥使用裸数字,公平地说,任何具有非字符串密钥的JSON都不应该通过测试吗?

  • 我一直在尝试使用Eclipse和Forge编译Minecraft mod,但我只是遇到错误,我想这是与链接Minecraft库有关,但不确定这是我的代码 我正在遵循一个指南,应该在最后得到一条“构建成功”的消息。指南是https://blog.usejournal.com/a-beginners-guide-to-modding-Minecraft-9A42536495F6 这里有个错误

  • 嘿,我刚刚开始我的第一本关于Java的编程书,所以这应该是一个简单的修复。把我对条件句的新知识弄得乱七八糟的,结果我得到了标题错误。 代码如下: 当我尝试编译: