org.apache.spark.SparkException: Task not serializable当我尝试在Spark 1.4.1上执行以下操作时,我得到:
import java.sql.{Date, Timestamp}
import java.text.SimpleDateFormat
object ConversionUtils {
val iso8601 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX")
def tsUTC(s: String): Timestamp = new Timestamp(iso8601.parse(s).getTime)
val castTS = udf[Timestamp, String](tsUTC _)
}
val df = frame.withColumn("ts", ConversionUtils.castTS(frame("ts_str")))
df.first
Run Code Online (Sandbox Code Playgroud)
在这里,frame是一个DataFrame生活在一个HiveContext.该数据框没有任何问题.
我有类似的整数UDF,它们没有任何问题.但是,带有时间戳的那个似乎会引起问题.根据文档,java.sql.TimeStamp工具Serializable,所以这不是问题.SimpleDateFormat从这里可以看出,情况也是如此.
这让我相信它是导致问题的UDF.但是,我不确定是什么以及如何解决它.
跟踪的相关部分:
Caused by: java.io.NotSerializableException: ...
Serialization stack:
- object not serializable (class: ..., value: ...$ConversionUtils$@63ed11dd)
- field (class: ...$ConversionUtils$$anonfun$3, name: $outer, type: …Run Code Online (Sandbox Code Playgroud) 我正在尝试在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
})
})
Run Code Online (Sandbox Code Playgroud)
我该如何避免java.io.NotSerializableException: java.time.format.DateTimeFormatter异常?是否有更好的库来解析时间戳?我已经读过Joda也不是可序列化的,并且已经被整合到Java 8的时间库中.
我正在尝试为返回包含数组的类的元组的函数编写单元测试。
由于数组的原因,简单assert(out === expectedOut)或out should be(expectedOut)不比较 LHS 和 RHS 上的类的内容。ScalaTest 中有没有一种巧妙的方法可以做到这一点?
我看过自定义匹配器,但我不确定这是否是我想做的事情的最佳方法。因此,任何来自专家经验的信息将不胜感激。
编辑:这是一个似乎并非如此的情况:
object Utils {
case class Product(id: Int, prices: Array[Int])
def getProductInfo(id: Int, prices: Array[Int]): Option[Product] = {
val sortedPrices = prices.sortWith(_ < _)
Some(Product(id, sortedPrices))
}
}
---
import org.scalatest._
import Utils._
class DataProcessorSpec extends FlatSpec with Matchers with OptionValues {
val id = 12345
val priceList = Array(10,20,30)
val prod = Utils.getProductInfo(id, priceList)
val expectedProd = Some(Utils.Product(id, priceList))
"A DataProcessorSpec" should "return …Run Code Online (Sandbox Code Playgroud) 是否有(最好是轻量级的)方式将降价文件的原始内容包含在HTML中?
我正在使用remark.js创建幻灯片,并且希望将markdown文件与HTML分开,以便HTML非常简单(并且不会更改):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
<link rel="stylesheet" href="style.css">
<script src="https://gnab.github.io/remark/downloads/remark-latest.min.js"></script>
</head>
<body>
<textarea id="source">
>>'paste' markdown file test.md<<
</textarea>
<script>
var slideshow = remark.create({
highlightStyle: 'darkula',
highlightLines: true
});
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
理想情况下,它可以脱机运行并在本地计算机上运行(不运行Web服务器)。带有“粘贴”降价文件test.md的位显然不起作用(因此,我的问题)。我试过了:
object data="test.md" 但这会产生难看的iframe我有以下JSON(粗略),我想分别从header和defects字段中提取信息:
{
"file": {
"header": {
"timeStamp": "2016-03-14T00:20:15.005+04:00",
"serialNo": "3456",
"sensorId": "1234567890",
},
"defects": [
{
"info": {
"systemId": "DEFCHK123",
"numDefects": "3",
"defectParts": [
"003", "006", "008"
]
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用file.header.timeStampetc 访问各个元素但返回null.我尝试过使用,flatten(file)但这给了我
无法将org.apache.drill.exec.vector.complex.MapVector转换为org.apache.drill.exec.vector.complex.RepeatedValueVector
我已经调查了kvgen()但是看不出这对我的情况如何.我试过kvgen(file.header)但是这让我受益匪浅
kvgen函数仅支持简单映射作为输入
这无论如何都是我所期待的.
有谁知道我能得到header并且defects,这样我就可以处理其中包含的信息.理想情况下,我只是选择信息,header因为它不包含数组或地图,因此我可以按原样获取单个记录.因为defects我只是FLATTEN(defectParts)用来获得有缺陷部件的表格.
任何帮助,将不胜感激.
DataFrame我试图将 a (称为:)的单列的不同值df放入与该列的数据类型匹配的数组中。这是我尝试过的,但它不起作用:
def distinctValues[T: ClassTag](column: String): Array[T] = {
df.select(df(column)).distinct.map {
case Row(s: T) => s
}.collect
}
Run Code Online (Sandbox Code Playgroud)
该方法位于隐式类内部,因此调用df.distinctValues("some_col")给了我:
scala.MatchError: [ABCD] (of class org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema)
Run Code Online (Sandbox Code Playgroud)
有没有一种优雅的方式来实现我想要的,而且类型安全?
我使用的是 Spark 1.4.1。
我在Scala中有一个方法,该方法具有固定数量的参数,其签名无法更改:
def myMethod(a1: Int, a2: Int, a3: Int): Int = { /* stuff happens */ }
Run Code Online (Sandbox Code Playgroud)
我也有一个数组arr,其中元素的数量完全正确,因为中有参数myMethod。如果myMethod是vararg方法,我可以使用怪异的: _*符号将数组作为参数传递。我想做类似的事情
myMethod(/*some Scala magic with arr*/)
Run Code Online (Sandbox Code Playgroud)
在Scala中有没有一种方法可以优雅地做到这一点,而无需myMethod使用vararg?
让我说我有以下代码,我允许混合生物,因为有人可以混合和匹配物种(例如,只有纯人类或纯外星人),我想有一个方法,解释什么是'混入',这是叫say:
trait Person {
def say(): Unit
}
trait Human {
def say(): Unit = println("Hi, I am a human")
}
trait Dude extends Human {
override def say(): Unit = {
super.say()
println("Duuude!")
}
}
abstract class Alien(msg: String) extends Person {
def say(): Unit = println(s"Hi, I'm an alien: $msg")
}
class Hybrid(name: String) extends Alien("bleep") with Dude // does not work!
val someone = new Hybrid("John")
someone.say()
Run Code Online (Sandbox Code Playgroud)
这不能编译,因为:
error: overriding method say in class Alien …Run Code Online (Sandbox Code Playgroud) scala ×6
apache-spark ×3
apache-drill ×1
html ×1
html5 ×1
java ×1
json ×1
remarkjs ×1
scalatest ×1