我是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.
情侣问题:
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可能非常昂贵.
我错过了什么吗?
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) 我正在使用新的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中我写了命名输出totals和uniques.