这里的问题是关于将案例类映射到Map [String,Any].我想知道相反的方法是什么,将Map [String,Any]转换为case类.给出以下地图:
val mp = Map("name" -> "Tom", "address" -> Map("street" -> "Jefferson st", "zip" -> 10000))
Run Code Online (Sandbox Code Playgroud)
将其转换为以下案例类Person:
case class Person(name:String, address:Address)
case class Address(street:String, zip:Int)
val p = Person("Tom", Address("Jefferson st", 10000))
Run Code Online (Sandbox Code Playgroud)
用这样的东西:
val newP = mp.asCC[Person]
assert(newP.get == p)
Run Code Online (Sandbox Code Playgroud)
我应该如何使用Shapeless.
我试图使用Shapeless 来解决这个问题,总结一下,它是关于将嵌套的case类转换为Map [String,Any],这是示例:
case class Person(name:String, address:Address)
case class Address(street:String, zip:Int)
val p = Person("Tom", Address("Jefferson st", 10000))
Run Code Online (Sandbox Code Playgroud)
它想转换p为以下内容:
Map("name" -> "Tom", "address" -> Map("street" -> "Jefferson st", "zip" -> 10000))
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用Shapeless LabelledGeneric,这是我迄今为止所做的:
import shapeless._
import record._, syntax.singleton._
import ops.record._
import shapeless.ops.record._
def writer[T,A<:HList,H<:HList](t:T)
(implicit lGeneric:LabelledGeneric.Aux[T,A],
kys:Keys.Aux[A,H],
vls:Values[A]) = {
val tGen = lGeneric.to(t)
val keys = Keys[lGeneric.Repr].apply
val values = Values[lGeneric.Repr].apply(tGen)
println(keys)
println(values)
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用递归编写器来检查每个值,并尝试为值中的每个元素创建Map.上面的代码工作正常但是当我想要values使用以下代码迭代时,我得到了这些错误.
values.map(identity)
//or
tGen.map(identity)
Error:(75, 19) could not …Run Code Online (Sandbox Code Playgroud) 我想从URL下载一个zip文件(我的数据库)并将其提取到特定文件夹(例如资源)中.我想在我的项目构建sbt文件中执行此操作.这样做的适当方法是什么?我知道sbt.IO已经解压缩并下载了.我找不到一个使用下载的好例子(那些我发现不起作用).有什么sbt插件可以帮我吗?
假设我有一个清单:
val list = List(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)
我想替换满足谓词的所有/第一项,我知道以下方法:(例如,替换任何偶数为-1的数字)
val filteredList = list.zipWithIndex.filter(_._2 % 2 == 0)
val onlyFirst = list.updated(filteredList.head._2, -1)
val all = for(i <- list) yield if(i % 2 ==0) -1 else i
Run Code Online (Sandbox Code Playgroud)
是否有任何收集功能或不错的Scala方式有助于这种情况并具有良好的性能?
我也想保留订单,所以我不想使用filterNot和添加其他项目,如:(它也没有效率)
val onlyFirst = list.filterNot(_ % 2 != 0) ::: list.filter(_ % 2 == 0).map(x => -1)
Run Code Online (Sandbox Code Playgroud) 我有以下配置:
sealed trait Status
case object Edited extends Status
case object NotEdited extends Status
case class Tweet(content:String, status:Status)
Run Code Online (Sandbox Code Playgroud)
我想使用Play Json格式,所以我想我必须有这样的东西(我不想在伴侣对象中这样做):
trait JsonImpl{
implicit val TweetFormat = Json.format[Tweet]
implicit val statusFormat = Json.format[Status]
implicit val StatusFormat = Json.format[Edited.type]
implicit val NotEditedFormat = Json.format[NotEdited.type]
}
Run Code Online (Sandbox Code Playgroud)
但编译器抱怨并说:
No implicit format for Tweet available.
它也说我无法使用,Edited.type因为它需要应用和取消应用功能.我该怎么办?
EDIT1:
我能想到这样的事情:
implicit object StatusFormat extends Format[Status] {
def reads(json: JsValue) =
(json \ "type").get.as[String] match {
case "" => Edited
case _ => UnEdited
}
def …Run Code Online (Sandbox Code Playgroud) 我想创建一个像这个例子这样的模式:
friendSchema = StructType([ \
StructField("firstname",StringType(),True), \
StructField("middlename",StringType(),True), \
StructField("friends",**friendSchema**,True)
Run Code Online (Sandbox Code Playgroud)
我知道数据必须标准化,但我想知道 Spark 是否具有创建如上所述的模式的功能。如果可以的话,怎样才能做到呢?使用UDT可行吗?
Cassandra 支持CONTAINS集合:
CREATE TABLE contacts (
id int PRIMARY KEY,
firstName text,
lastName text,
phones map<text, text>,
emails set<text>
);
CREATE INDEX ON contacts (firstName);
CREATE INDEX ON contacts (keys(phones)); // Using the keys function to index the map keys
CREATE INDEX ON contacts (emails);
Run Code Online (Sandbox Code Playgroud)
并且可以查询emails集合并检查特定电子邮件。简单地:
SELECT * FROM contacts WHERE emails CONTAINS 'Benjamin@oops.com';
Run Code Online (Sandbox Code Playgroud)
如果要检查是否缺少某个元素(例如:),解决方案是什么DOES NOT CONTAIN?我在 CQL 文档中找不到这样的功能,有什么解决方案吗?
如何更有效地执行以下操作:
myoptionList.filter(_.isDefined).map(_.get)
Run Code Online (Sandbox Code Playgroud)
这需要两次迭代时间,有没有更好的方法来做到这一点?
我有两个案例类:
case class B(value:Int)
case class A(a:String, b:B*) extends ALike
Run Code Online (Sandbox Code Playgroud)
我想在A的实例上进行模式匹配:
def foo(al:ALike) = {
al match {
case A(a, bs) => ...
}
}
Run Code Online (Sandbox Code Playgroud)
Scalac不明白这bs是一个Seq[B]并且认为它只是一个B.为什么会这样,我该如何进行模式匹配呢?
scala ×8
shapeless ×3
apache-spark ×1
cassandra ×1
cql ×1
cql3 ×1
json ×1
pyspark ×1
sbt ×1
scala-macros ×1