小编Ian*_*Ian的帖子

Spark:DataFrame上的UDF任务不可序列化

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)

serialization scala apache-spark

16
推荐指数
1
解决办法
7983
查看次数

Spark和Not Serializable DateTimeFormatter

我正在尝试在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的时间库中.

java serialization scala apache-spark

14
推荐指数
2
解决办法
5864
查看次数

ScalaTest 深度比较最佳实践

我正在尝试为返回包含数组的类的元组的函数编写单元测试。

由于数组的原因,简单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)

scala scalatest

5
推荐指数
1
解决办法
6676
查看次数

在remark.js的HTML中包含markdown文件的内容

是否有(最好是轻量级的)方式将降价文件的原始内容包含在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
  • 这种解决方案,但我只是得到一个空白页(我将CDN用于jQuery)。

html html5 remarkjs

5
推荐指数
1
解决办法
745
查看次数

Apache Drill中无嵌套的嵌套JSON结构

我有以下JSON(粗略),我想分别从headerdefects字段中提取信息:

{
  "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)用来获得有缺陷部件的表格.

任何帮助,将不胜感激.

json apache-drill

4
推荐指数
1
解决办法
1612
查看次数

从 DataFrame 到 Array 的不同值

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 apache-spark

4
推荐指数
1
解决办法
4466
查看次数

在Scala非可变参数方法中将Seq作为参数传递

我在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?

scala

2
推荐指数
1
解决办法
280
查看次数

使用覆盖来堆叠特征和抽象类

让我说我有以下代码,我允许混合生物,因为有人可以混合和匹配物种(例如,只有纯人类或纯外星人),我想有一个方法,解释什么是'混入',这是叫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

0
推荐指数
1
解决办法
51
查看次数