我正在尝试从Spark中的java.time.format使用DateTimeFormatter,但它似乎不可序列化。这是相关的代码块:
val pattern = "<some pattern>".r
val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>")
val logs = sc.wholeTextFiles(path)
val entries = logs.flatMap(fileContent => {
val file = fileContent._1
val content = fileContent._2
content.split("\\r?\\n").map(line => line match {
case pattern(dt, ev, seq) => Some(LogEntry(LocalDateTime.parse(dt, dtFormatter), ev, seq.toInt))
case _ => logger.error(s"Cannot parse $file: $line"); None
})
})
如何避免出现java.io.NotSerializableException: java.time.format.DateTimeFormatter
异常?是否有更好的库来解析时间戳?我读过,Joda也不是可序列化的,并且已并入Java
8的时间库中。
您可以通过两种方式避免序列化:
object
(使其成为“静态”)。这意味着可以在每个工作程序中访问静态值,而不是驱动程序将其序列化并发送给工作程序: object MyUtils {
val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>")
}
import MyUtils._
logs.flatMap(fileContent => {
// can safely use formatter here
})
logs.flatMap(fileContent => {
val dtFormatter = DateTimeFormatter.ofPattern("<some non-ISO pattern>")
// use formatter here
})
我对Spark,Scala和Cassandra都是新手。使用Spark,我试图从MySQL获取一些ID。 我可以看到在控制台打印的ID。 当我试图在每个提取id上运行相同的函数时 它给出与例外相同的例外 在阅读spark-shell中的Apache spark:“sparkException:Task not serializable”后,我尝试将@transient添加到RDDs中
null 每当我尝试访问sc时,我会得到以下错误。我在这里做错了什么?
问题内容: 我们在Spark上使用Redis来缓存键值对,这是代码: 但是编译器给了我这样的反馈: 有人可以告诉我如何序列化从Redis获得的数据。非常感谢。 问题答案: 在Spark中,s(如此处)上的函数被序列化并发送给执行程序进行处理。这意味着这些操作中包含的所有元素都应该可序列化。 Redis连接不可序列化,因为它打开了到目标DB的TCP连接,该TCP连接已绑定到创建它的机器。 解决方案是
问题在于Spark数据集和INT列表的序列化。Scala版本是2.10.4,Spark版本是1.6。 这和其他问题类似,但是我不能基于这些回答让它工作。我已经简化了代码,以便仅仅显示问题。 我有一门案例课: 我的主要方法是: 我得到以下错误: 如果我从FlightExt中删除列表,那么一切正常,这表明lambda函数序列化没有问题。 Scala本身似乎序列化了一系列Int的优点。也许Spark在序
这是我的源代码,其中Im从服务器端获取一些数据,服务器端不断生成数据流。然后,对于每个RDD,我应用SQL模式,一旦创建了这个表,我就会尝试从这个数据流中选择一些东西。 但是它抛出了这个可序列化的异常,尽管我使用的类确实实现了序列化。
除了集成SparkSQL和Spark Streaming时不可序列化的异常 我的源代码 JavaSQLContext也在ForeachRDD循环之外声明,但我仍然得到了NonSerializableException 23年12月14日23:49:38错误JobScheduler:运行作业流作业1419378578000 ms.1 org.apache.spark时出错。SparkExceptio