小编col*_*red的帖子

为什么List是Semigroup而Seq不是?

我是scalaz的新手,我试图找出以下代码的工作原理:

import scalaz._
import Scalaz._
scala> Map[String,List[String]]() |+| Map[String,List[String]]()
res3: scala.collection.immutable.Map[String,List[String]] = Map()
Run Code Online (Sandbox Code Playgroud)

但这不......

import scalaz._
import Scalaz._
scala> Map[String,Seq[String]]() |+| Map[String,Seq[String]]()
<console>:14: error: value |+| is not a member of      scala.collection.immutable.Map[String,Seq[String]]
          Map[String,Seq[String]]() |+| Map[String,Seq[String]]()
Run Code Online (Sandbox Code Playgroud)

我看到Semigroup隐含了Map,但我看不到List或Seq的Map.

情侣问题:

  1. ListSemigroup隐含在哪里?
  2. 为什么Seq不存在?

functional-programming scala scalaz scalaz7

24
推荐指数
1
解决办法
1679
查看次数

为什么scalaz实现Monoid for Option会两次评估f2函数?

scalaz选项monoid的定义如下:

implicit def optionMonoid[A: Semigroup]: Monoid[Option[A]] = new Monoid[Option[A]] {
  def append(f1: Option[A], f2: => Option[A]) = (f1, f2) match {
    case (Some(a1), Some(a2)) => Some(Semigroup[A].append(a1, a2))
    case (Some(a1), None)     => f1
    case (None, Some(a2))     => f2
    case (None, None)         => None
  }

  def zero: Option[A] = None
}
Run Code Online (Sandbox Code Playgroud)

f2是名称param的传递,这意味着每个调用将评估表达式.为什么要在模式匹配中进行评估时再次进行评估?返回Some(a2)应该是相同的结果,并且表达式f2可能非常昂贵.

我错过了什么吗?

Scalaz的Option.scala源代码

scala scalaz scalaz7

7
推荐指数
1
解决办法
449
查看次数

为什么scala编译器不会在模式匹配中始终产生false的if语句生成警告?

scala编译器应该为我在下面评论过的if语句生成警告,但事实并非如此.为什么?

sealed trait T
object A extends T

val s:Seq[T] = Seq(A)

val result = s.map {
    //This if should produce a compiler warning
    case a if(a == "A") => 
        "First"
    case a => 
      //This if should produce a compiler warning
      if (a == "A") {
        "Second"
      }
      else
      {
        "Third"
      }
}
Run Code Online (Sandbox Code Playgroud)

其结果将是"第三条:"如你所期望,但是编译器应该产生一个警告就case a if(a == "A")和上if (a == "A"),但很可惜没有警告.

如果我编写以下代码,它的行为就像我期望的那样:

if(A == "A"){
  println("can't happen")
}

// warning: comparing values of types A.type and …
Run Code Online (Sandbox Code Playgroud)

scala scala-compiler

6
推荐指数
1
解决办法
180
查看次数

使用oozie为mapreduce作业写入多个输出流的正确方法是什么?

我正在使用新的Hadoop API编写一系列map-reduce作业.我打算使用Oozie的管线所有的这些结合在一起,但我似乎无法找到一种方法,从做多输出流,map-reduce工作流中的节点.

通常情况下写的多路输出,我会用类似在给定的代码代码MultipleOutputs的javadoc,但Oozie的会从它的所有配置workflow.xml文件,因此命名为输出不能被配置成类似于他们在例子.

我遇到一个线程讨论使用在Oozie的多路输出,但没有提出超出了创建一个Java的任务,它直接增加了Oozie的pipline解决方案.

有没有办法通过这个map-reduce节点workflow.xml

编辑:

克里斯的解决方案确实有效,但我希望有更好的方法.以下是我所做的确切更改.

我将以下内容添加到workflow.xml文件中:

<property>
    <name>mapreduce.multipleoutputs</name>
   <value>${output1} ${output2}</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output1}.key</name>
   <value>org.apache.hadoop.io.Text</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output1}.value</name>
   <value>org.apache.hadoop.io.LongWritable</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output1}.format</name>
   <value>org.apache.hadoop.mapreduce.lib.output.TextOutputFormat</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output2}.key</name>
   <value>org.apache.hadoop.io.Text</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output2}.value</name>
   <value>org.apache.hadoop.io.LongWritable</value>
</property>
<property>
    <name>mapreduce.multipleoutputs.namedOutput.${output2}.format</name>
   <value>org.apache.hadoop.mapreduce.lib.output.TextOutputFormat</value>
</property>
Run Code Online (Sandbox Code Playgroud)

我将以下内容添加到job.properties文件中,该文件在启动时被提供给oozie:

output1=totals
output2=uniques
Run Code Online (Sandbox Code Playgroud)

然后在reducer中我写了命名输出totalsuniques.

java hadoop mapreduce oozie

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