我是Apache Spark的新手,我正在尝试将一段简单的scala代码部署到Spark.
注意:我正在尝试连接到我通过我的java参数配置的现有正在运行的集群:spark.master=spark://MyHostName:7077
环境
sbt:0.13.8
码
import org.apache.spark.{SparkConf, SparkContext}
object HelloSpark {
def main(args: Array[String]) {
val logFile = "/README.md"
val conf = new SparkConf().setAppName("Simple Application")
val sc = new SparkContext(conf)
val logData = sc.textFile(logFile, 2).cache()
val numAs = logData.filter(line => line.contains("a")).count()
println("%s done!".format(numAs))
}
}
Run Code Online (Sandbox Code Playgroud)
build.sbt
name := "data-streamer210"
version := "1.0"
scalaVersion := "2.10.4" …Run Code Online (Sandbox Code Playgroud) 我找到了一些答案,但没有什么对我有用.
试图模拟返回void的Apache Shiro Subject接口登录方法.
接口:
void login(AuthenticationToken token) throws AuthenticationException;
Run Code Online (Sandbox Code Playgroud)
我试过了 :
#1
val subject = mock[Subject]
doNothing().when(subject).login(new UsernamePasswordToken())
#2
val subject = mock[Subject]
doNothing().when(subject).login(any[UsernamePasswordToken])
#3
when(subject.login(any[UsernamePasswordToken])).thenAnswer(new Answer[Void]() {
override def answer(invocation: InvocationOnMock): Void = {
null:Void
}
Run Code Online (Sandbox Code Playgroud)
我在登录时不断收到NullPointerException.我的目标是测试登录方法并测试一些成功案例以及此方法抛出异常的一些失败案例.
假设我们有以下案例类:
case class CasePerson(firstName: String)
Run Code Online (Sandbox Code Playgroud)
我们还为它定义了一个伴侣对象:
object CasePerson {
def apply() = new CasePerson( "XYZ" )
}
Run Code Online (Sandbox Code Playgroud)
请注意,在上面的示例中,我使用apply方法显式定义了伴随对象,而没有定义默认的apply方法:
// This "default" apply has the same argument as the primary constructor of the case class
def apply(firstName : String) = new CasePerson(firstName)
Run Code Online (Sandbox Code Playgroud)
问:那么Scala在哪里获得"默认"适用?我在这里明确定义了伴随对象,没有默认的apply,编译器仍然知道如何执行:
val casePerson = CasePerson("PQR")
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?
目标是实现Scalaz为Spark的RDD(分布式集合)提供的不同类型类(如Semigroup,Monad,Functor等).不幸的是,我不能使任何采用更高级别类型(如Monad,Functor等)的类型类与RDD一起使用.
RDD被定义(简化)为:
abstract class RDD[T: ClassTag](){
def map[U: ClassTag](f: T => U): RDD[U] = {...}
}
Run Code Online (Sandbox Code Playgroud)
可以在此处找到完整的RDD代码.
这是一个很好的例子:
import scalaz._, Scalaz._
import org.apache.spark.rdd.RDD
implicit def semigroupRDD[A] = new Semigroup[RDD[A]] {
def append(x:RDD[A], y: => RDD[A]) = x.union(y)
}
Run Code Online (Sandbox Code Playgroud)
这是一个不起作用的例子:
implicit def functorRDD = new Functor[RDD] {
override def map[A, B](fa: RDD[A])(f: A => B): RDD[B] = {
fa.map(f)
}
}
Run Code Online (Sandbox Code Playgroud)
这失败了:
错误:没有ClassTag可用于B fa.map(f)
错误很清楚.在RDD中实现的地图需要ClassTag(见上文).ScalaZ仿函数/ monad等没有ClassTag.甚至可以在不修改Scalaz和/或Spark的情况下完成这项工作吗?
我有两个选项
val opt1 = Some(List("Sal", "Salil"))
val opt2 = Some(List("Sal2", "Salil2"))
Run Code Online (Sandbox Code Playgroud)
opt1或opt2可以是None.如果任何一个是None,那么我想要一个包含在另一个中的List的选项.如果两者都是None,则应返回None.
如果两者都是Some,那么有些列表包含来自两个列表的元素,如下所示:
Some(List(Sal, Salil, Sal2, Salil2))
Run Code Online (Sandbox Code Playgroud)
我知道我可以手工做到这一点,但有一种优雅的方式来做到这一点吗?如果其中一个选项为"无",则"推理"不起作用.
Spark从中读取默认配置$SPARK_HOME/conf/spark-defaults.conf。
--properties-file [FILE]使用(say)时,还可以使用命令行参数来更改默认位置spark-submit。
我想做的是从文件中加载其他参数,而不必替换默认参数。也就是说,我希望spark spark-defaults.conf从另一个文件加载属性并从另一个文件加载更多属性。现在,如果两者都定义了属性,则我希望最后一个配置文件获胜。
Spark默认支持此功能吗?
有没有办法在组装过程中增加内存(插件)?我注意到通过SBT_OPTS向sbt添加更多内存并没有多大帮助.我怀疑程序集正在分支一个单独的JVM,它不会从sbt继承JVM配置.
这是错误:
java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError:Java堆空间
这是我没有太多运气的尝试:
javaOptions in assembly += "-Xmx2g"
我有5个脚本测试来测试我的sbt插件.所有这些都需要很长时间才能运行.我有时想只运行其中一个测试.
是否可以指定脚本运行哪个测试?
我有以下代码,其中rddMap是org.apache.spark.rdd.RDD[(String, (String, String))],myHashMap是scala.collection.mutable.HashMap.
我做.saveAsTextFile("temp_out")了强制评估rddMap.map.
然而,即使println(" t " + t)是打印东西,后来myHashMap仍然只有一个我手动放在一开始的元素("test1", ("10", "20")).其中的一切都rddMap没有投入myHashMap.
代码段:
val myHashMap = new HashMap[String, (String, String)]
myHashMap.put("test1", ("10", "20"))
rddMap.map { t =>
println(" t " + t)
myHashMap.put(t._1, t._2)
}.saveAsTextFile("temp_out")
println(rddMap.count)
println(myHashMap.toString)
Run Code Online (Sandbox Code Playgroud)
为什么我不能把rddMap中的元素放到我的myHashMap?
在Scala中,我有一个由一组句子组成的文本.我试图将这个文本拆分成这样的单个句子:
val sentences: Array[String] = text.split(".")
Run Code Online (Sandbox Code Playgroud)
但是,当我检查sentences数组时(如下面的行中所示),我发现数组是空的:
println("Sentences are: " + sentences.mkString(" "))
Run Code Online (Sandbox Code Playgroud)
为什么分裂没有正确完成?
对于文字:
A sword is a bladed weapon intended for both cutting and thrusting. The precise definition of the term varies with the historical epoch or the geographical region under consideration. A sword in the most narrow sense consists of a straight blade with two edges.
Run Code Online (Sandbox Code Playgroud)
输出是:
Sentences are:
Run Code Online (Sandbox Code Playgroud) 作为一个练习,我试图看看我是否可以List[Any]使用无形的方法将其"投射"到案例类中.
我想要实现的一个非常基本的例子:
case class Foo(i: Int, j: String)
val foo: Option[Foo] = fromListToCaseClass[Foo]( List(1:Any, "hi":Any) )
Run Code Online (Sandbox Code Playgroud)
以下是我如何塑造我的解决方案(这可能非常不合适):
def fromListToCaseClass[CC <: Product](a: List[Any]): Option[CC] = a.toHList[???].map( x => Generic[CC].from(x) )
Run Code Online (Sandbox Code Playgroud)
这是我的推理:
我知道你可以从case类转到HList [T](CC - > HList [T]); 其中T是HList的类型.我也知道你可以从列表中创建一个HList(list - > Option [HList]),只要你知道HList的类型.最后我知道你可以从HList转到案例类(HList - > CC).
CC -> HList[T]
list -> Option[HList[T]] -> Option[CC]
Run Code Online (Sandbox Code Playgroud)
我想知道这是否有意义,或者我是否离开这里.我们能做到这一点吗?还有其他建议吗?谢谢!
在Scala中,我们可以通过以下方式创建Range对象:
var range = 1 to 10
Run Code Online (Sandbox Code Playgroud)
或者改为使用构造函数
var range = new Range(1,10,1)
Run Code Online (Sandbox Code Playgroud)
但是,如果我们查看Scala API for Range,我们只能看到一个定义了3个参数的构造函数.所以我的问题是:我们在哪里可以找到像第一个那样的构造函数的API?我希望在API页面上找到这些信息.
我有一个Scala函数,其显式返回类型为RDD:
def myfunction(x:Int):RDD = {
if (x==1) {
formRDD()
} else {
}
}
Run Code Online (Sandbox Code Playgroud)
如果我不想形成一个空的RDD,我不知道如何处理其他问题.
scala ×11
apache-spark ×5
sbt ×3
rdd ×2
case-class ×1
hashmap ×1
mockito ×1
return-type ×1
sbt-assembly ×1
sbt-plugin ×1
scalaz ×1
shapeless ×1
spec2 ×1