Questions tagged «scala»

Scala是主要针对Java虚拟机的通用编程语言。它旨在以简洁,优雅和类型安全的方式表达常见的编程模式,它融合了命令式和功能性编程风格。它的主要特征是:具有类型推断功能的高级静态类型系统;功能类型;模式匹配; 隐式参数和转换;操作符重载;与Java完全互操作性;并发

4
如何在Scala中对匹配数组进行模式化?
我的方法定义如下 def processLine(tokens: Array[String]) = tokens match { // ... 假设我想知道第二个字符串是否为空 case "" == tokens(1) => println("empty") 不编译。我该怎么做呢?
68 scala 

3
是否有Scala身份功能?
如果我有类似a的东西List[Option[A]]并且想要将其转换为a List[A],则标准方法是使用flatMap: scala> val l = List(Some("Hello"), None, Some("World")) l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World)) scala> l.flatMap( o => o) res0: List[java.lang.String] = List(Hello, World) 现在o => o只是一个身份功能。我本以为可以采取一些措施: l.flatMap(Identity) //return a List[String] 但是,由于您无法生成一个,所以我无法执行此操作object。我尝试了几件事无济于事。有人有这样的工作吗?


11
Scala中的类型类有什么用?
从这篇博客文章中我了解到 ,Scala中的“类型类”只是使用特征和隐式适配器实现的“模式”。 如博客中所述,如果我具有traitA和适配器,B -> A那么我可以调用一个函数,该函数需要typeA的参数和type类型的参数,B而无需明确调用此适配器。 我发现它不错,但不是特别有用。您能否给出一个用例/示例,以说明此功能的用途?
67 scala  implicit 


4
为什么在Scala中压缩速度比压缩速度快?
我已经编写了一些Scala代码以对集合执行按元素操作。在这里,我定义了两种执行相同任务的方法。一种方法使用zip,另一种方法使用zipped。 def ES (arr :Array[Double], arr1 :Array[Double]) :Array[Double] = arr.zip(arr1).map(x => x._1 + x._2) def ES1(arr :Array[Double], arr1 :Array[Double]) :Array[Double] = (arr,arr1).zipped.map((x,y) => x + y) 为了比较这两种方法的速度,我编写了以下代码: def fun (arr : Array[Double] , arr1 : Array[Double] , f :(Array[Double],Array[Double]) => Array[Double] , itr : Int) ={ val t0 = System.nanoTime() …

2
Spark:在我的用例中,为什么Python明显优于Scala?
为了比较使用Python和Scala时Spark的性能,我用两种语言创建了相同的作业,并比较了运行时。我希望两个作业都花费大致相同的时间,但是Python作业仅花费27min,而Scala作业却花费了37min(将近40%!)。我也用Java实现了同样的工作,而且也花了很多37minutes时间。Python怎么可能这么快? 最小的可验证示例: Python工作: # Configuration conf = pyspark.SparkConf() conf.set("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider") conf.set("spark.executor.instances", "4") conf.set("spark.executor.cores", "8") sc = pyspark.SparkContext(conf=conf) # 960 Files from a public dataset in 2 batches input_files = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312025.20/warc/CC-MAIN-20190817203056-20190817225056-00[0-5]*" input_files2 = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312128.3/warc/CC-MAIN-20190817102624-20190817124624-00[0-3]*" # Count occurances of a certain string logData = sc.textFile(input_files) logData2 = sc.textFile(input_files2) a = logData.filter(lambda value: …

1
van Laarhoven是否表示“可选”
许多类型的光学元件都具有van Laarhoven表示。 例如,Lens类型的a Lens s t a b 可以表示为: Functor f => (a -> f b) -> s -> f t 类似地Traversal,可以用类似的方式表示,将Functor约束交换为Applicative: Applicative f => (a -> f b) -> s -> f t 几种光学框架(例如Monocle和Arrow)定义了一种类型Optional。 在《单片眼镜光学》中,层次结构 Optional介于Lens和之间Traversal 根据我的理解:如果Traversal是像一个Lens可能具有零到多个目标,那么Optional就像是一个Lens可能具有零到一的目标。 在Monocle中,Optional定义为一对功能: getOrModify :: s -> Either t a set :: (b, s) …

1
如何解释Scala Cats / fs2中的堆栈安全性?
这是fs2文档中的一段代码。该函数go是递归的。问题是我们如何知道它是否是堆栈安全的,以及如何推断任何函数是否是堆栈安全的? import fs2._ // import fs2._ def tk[F[_],O](n: Long): Pipe[F,O,O] = { def go(s: Stream[F,O], n: Long): Pull[F,O,Unit] = { s.pull.uncons.flatMap { case Some((hd,tl)) => hd.size match { case m if m <= n => Pull.output(hd) >> go(tl, n - m) case m => Pull.output(hd.take(n.toInt)) >> Pull.done } case None …

2
当未明确给出返回类型时,为什么可以用返回字符串的方法覆盖返回单元的方法?
我正在阅读有关Scala Edition1中编程特性的章节中的代码示例, 网址为https://www.artima.com/pins1ed/traits.html 并由于我的错字而遇到奇怪的行为。尽管代码段下面的特征覆盖方法不会产生任何编译错误,但是覆盖方法的返回类型Unit与相对String。但是,在对象上调用该方法时,它返回Unit,但不打印任何内容。 trait Philosophical { def philosophize = println("I consume memory, therefore I am!") } class Frog extends Philosophical { override def toString = "green" override def philosophize = "It aint easy to be " + toString + "!" } val frog = new Frog //frog: Frog = …

5
为什么println被认为是不纯函数?
我正在阅读Scala中的编程书籍,据说: ...在这种情况下,其副作用是打印到标准输出流。 而且我看不到副作用在哪里,因为对于相同的输入,println会在每次 调用时输出相同的输出(我认为) UPDATE,例如: println(5) 它会打印5,我看不到调用println(5)将打印5以外的其他值的情况!

1
模式匹配中方法类型推断与类类型参数的区别
当类型参数来自封闭方法而不是封闭类时,为什么模式匹配的工作方式有所不同?例如, trait Base[T] case class Derived(v: Int) extends Base[Int] class Test[A] { def method(arg: Base[A]) = { arg match { case Derived(_) => 42 } } } 给出错误 constructor cannot be instantiated to expected type; found : A$A87.this.Derived required: A$A87.this.Base[A] case Derived(_) => 42 ^ 虽然它成功地编译A为方法类型参数 class Test { def …


3
GRPC:在Java / Scala中制作高吞吐量客户端
我有一项可以以很高的速率传输邮件的服务。 目前,它由akka-tcp提供服务,每分钟发送350万条消息。我决定尝试一下grpc。不幸的是,它导致吞吐量大大降低:每分钟约50万条消息甚至更低。 您能推荐如何优化它吗? 我的设定 硬件:32核,24Gb堆。 grpc版本:1.25.0 消息格式和端点 消息基本上是一个二进制blob。客户端将100K-1M和更多消息流传输到同一请求中(异步),服务器不响应任何内容,客户端使用无操作观察者 service MyService { rpc send (stream MyMessage) returns (stream DummyResponse); } message MyMessage { int64 someField = 1; bytes payload = 2; //not huge } message DummyResponse { } 问题:与akka实施相比,消息速率低。我观察到CPU使用率较低,因此我怀疑grpc调用实际上在内部阻塞,尽管它另有说明。onNext()确实不会立即返回调用,但表上也有GC。 我试图产生更多的发件人来缓解此问题,但并没有太大的改进。 我的发现 Grpc在序列化每个消息时实际上分配了一个8KB的字节缓冲区。请参阅堆栈跟踪: java.lang.Thread.State:在com.google.common.io.ByteStreams.copy(ByteStreams.java:com.google.common.io.ByteStreams.createBuffer(ByteStreams.java:58)处处于阻塞状态(在对象监视器上): 105)在io.grpc.internal.MessageFramer.writeToOutputStream(MessageFramer.java:274)在io.grpc.internal.MessageFramer.writeKnownLengthUncompressed(MessageFramer.java:230)在io.grpc.internal.MessageFramer.writeUncompressed(MessageFramer.java :168)位于io.grpc.internal.MessageFramer.writePayload(MessageFramer.java:141)位于io.grpc.internal.AbstractStream.writeMessage(AbstractStream.java:53)位于io.grpc.internal.ForwardingClientStream.writeMessage(ForwardingClientStream。 java:37)位于io.grpc.internal.DelayedStream.writeMessage(DelayedStream.java:252)位于io.grpc.internal。io.grpc.internal.ClientCallImpl.sendMessage(ClientCallImpl.java:457)的io.grpc.ForwardingClientCall.sendMessage(ForwardingClientCall.java:37)的io.grpc.internal.ClientCallImpl.sendMessageInternal(ClientCallImpl.java:473)io.grpc.ForwardingClientCall.sendMessage的(ForwardingClientCall.java:37)位于io.grpc.stub.ClientCalls $ CallToStreamObserverAdapter.onNext(ClientCalls.java:346) 对于构建高吞吐量grpc客户的最佳做法的任何帮助,均表示赞赏。
9 java  scala  grpc 

1
Spark:UDF执行多次
我有一个带有以下代码的数据框: def test(lat: Double, lon: Double) = { println(s"testing ${lat / lon}") Map("one" -> "one", "two" -> "two") } val testUDF = udf(test _) df.withColumn("test", testUDF(col("lat"), col("lon"))) .withColumn("test1", col("test.one")) .withColumn("test2", col("test.two")) 现在检查日志,我发现每行UDF执行3次。如果我从“ test.three”列中添加“ test3”,则将再次执行UDF。 有人可以解释我为什么吗? 是否可以正确避免这种情况(即使添加了“测试”,也无需缓存数据框,即使这可行)?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.