Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 3

9
votes
answers
10 views
+10

Decoding JSON values in circe where the key is not known at compile time

Suppose I've been working with some JSON like this:

{ "id": 123, "name": "aubergine" }

By decoding it into a Scala case class like this:

case class Item(id: Long, name: String)

This works just fine with circe's generic derivation:

scala> import io.circe.generic.auto._, io.circe.jawn.decode
import io.circe.generic.auto._
import io.circe.jawn.decode

scala> decode[Item]("""{ "id": 123, "name": "aubergine" }""")
res1: Either[io.circe.Error,Item] = Right(Item(123,aubergine))

Now suppose I want to add localization information to the representation:

{ "id": 123, "name": { "localized": { "en_US": "eggplant" } } }

I can't use a case class like this directly via generic derivation:

case class LocalizedString(lang: String, value: String)

…because the language tag is a key, not a field. How can I do this, preferably without too much boilerplate?

沙发
+90

您可以通过几种不同的方式将单例JSON对象解码为案例类,如 LocalizedString 最简单的是这样的:

  import io.circe.Decoder implicit val decodeLocalizedString:Decoder [LocalizedString] = Decoder [Map [String,String]]。map {kvs => LocalizedString(kvs.head._1,kvs.head._2)}   

这样做的缺点是在空的JSON对象上抛出一个异常,并且在行为未定义的情况下不止一个领域。您可以修复这样的问题:

  implicit val decodeLocalizedString:Decoder [LocalizedString] = Decoder [Map [String,String]]。map(_。toList).emap {case List(( k,v))=> 右(LocalizedString(K,v))案例Nil => 左(“空对象,预期单身”)案例_ => 左(“Multiply-fielding object,expected singleton”)}   

这可能是低效的,特别是如果你有可能最终试图解码真正大的JSON对象(这会转换成地图,然后是对的列表,只是为了失败。)。

如果你关心性能,你可以这样写:

  import io.circe.DecodingFailure implicit val decodeLocalizedString:Decoder [LocalizedString] = {c => c.value.asObject match {case Some(obj)if obj.size == 1 => val(k,v)= obj.toIterable.head v.as [String] .map(LocalizedString(k,_))case None => Left(DecodingFailure(“LocalizedString; expect singleton object”,c.history))}}   

然而,这解码了单例对象本身,并且在我们想要的表示中,我们有一个 {“localized”:{...}} 包装器。我们可以在最后用一个额外的行来容纳它:

  implicit val decodeLocalizedString:Decoder [LocalizedString] = Decoder.instance {c =&gt; c.value.asObject match {case Some(obj)if obj.size == 1 =&gt; val(k,v)= obj.toIterable.head v.as [String] .map(LocalizedString(k,_))case None =&gt; Left(DecodingFailure(“LocalizedString; expect singleton object”,c.history))}} .prepare(_。downField(“localized”))< / code>  

这适用于我们更新的 Item 类的一般派生实例:

  import io.circe.generic。 auto._,io.circe.jawn.decode case class Item(id:Long,name:LocalizedString)  

然后:

  scala&gt; val doc =“”“{”id“:123,”name“:{”localized“:{”en_US“:”eggplant“}}}”“”doc:String = {“id”:123,“name” :{“localized”:{“en_US”:“eggplant”}}} scala&gt; val Right(result)= decode [Item](doc)result:Item = Item(123,LocalizedString(en_US,eggplant))  

自定义编码器更直接: < pre> import io.circe。{Encoder,Json,JsonObject},io.circe.syntax._ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。 {Encoder,Json,JsonObject},io.circe.syntax._ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。 {Encoder,Json,JsonObject},io.circe.syntax._ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。 _ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。 _ implicit val encodeLocalizedString:Encoder.AsObject [LocalizedString] = {case LocalizedString(k,v)=&gt; JsonObject(“localized”:= Json.obj(k:= v))}

然后:

  scala&gt; result.asJson res11:io.circe.Json = {“id”:123,“name”:{“localized”:{“en_US”:“eggplant”}}}   

这方法适用于任何数量的“动态”字段 - 您可以将输入转换为 Map [String,Json] JsonObject ,并使用密钥 - 值对直接。

0
votes
answers
137 views
+10

替代加特林

2

我最近一直有問題,因爲我的依賴項已更新爲使用netty 4.1,而Gatling尚未更新一段時間,並且仍然只能在Netty 4.0上運行。替代加特林

任何人都知道Gatling的任何替代方法來創建類似的性能測試的模擬和場景,以便在我的Maven生命週期中自動運行嗎?

沙发
0
3

如果你尋找基於代碼的東西那就是:

對於UI和/或基於XML腳本定義,你可以檢查出:

退房Open Source Load Testing Tools: Which One Should You Use?瞭解更多有關上述工具,並決定哪一個適合你最。

板凳
0
2

Apache JMeter是加特林的一個已知替代品。

它經常更新(每年至少發佈2個主要版本),並且擁有強大的用戶羣和大量的商業優惠。

有一個最近更頻繁更新的Maven插件,在2個月內已經有4個版本。

查看更多細節的代碼覆蓋率。

+0

是的,它是可能的運行它在一個Maven的生命週期?我一直使用手動 – paul

+0

是的,JMeter Maven插件旨在做到這一點。 https://github.com/jmeter-maven-plugin/jmeter-maven-plugin – cezarykluczynski

+0

30%的代碼覆蓋率?嗯,謝謝,但讓我們看看它有任何其他的替代 – paul

地板
0
1

這裏還有一個不同工具的benchmark comparison

如果你是JavaScript/Ecma熟悉k6做這項工作。

4楼
0
1

作爲一個很好的替代加特林,我會建議你檢查蝗蟲。 Locust專門爲您提供的好處是,它是基於代碼的性能測試工具,不會強制您僅使用特定的編程語言(如Python)編寫測試。因爲如果你之前使用過Scala,那麼在編寫測試時,使用Locust框架進行測試比使用Locust框架更有可能更適合切換到Java甚至Kotlin之類的東西。您可以通過以下鏈接找到得心應手教程:

https://www.blazemeter.com/blog/locust-performance-testing-using-java-and-kotlin

+0

看起來很有趣,我一直在尋找碰Kotlin。謝謝! – paul

5楼
0
1

兩個最好的開源替代品磨牀是JMeter的和蝗蟲。 JMeter擁有優秀的用戶羣和支持社區,並提供直觀的界面。它還提供了很多第三方插件,並支持大多數協議(如HTTP,FTP,JDBC,SOAP,LDAP等)。儘管Locust是一個相對較新的工具,但它提供了很大的靈活性,因爲您可以使用純Python編寫測試。 Locust主要是爲HTTP協議而構建的,所以如果你正在使用基於HTTP的應用程序,你可以嘗試一下。在使用leading software testing company進行工作時,我對這兩種工具在不同的性能測試項目上都有實際操作經驗。

希望這些信息能夠幫助您根據您的測試要求爲Gatling選擇正確的替代方案。

感謝

維沙爾

0
votes
answers
56 views
+10

執行者上的Spark對象(單例)序列化

1

我不確定我想實現的是否可能。我所知道的是,我正從一個執行器訪問單例對象,以確保它的構造器在每個執行器上只被調用一次。這種模式已經在我的代碼庫中被證明和按照預期用於類似的用例。執行者上的Spark對象(單例)序列化

但是,我想知道的是,如果我可以在驅動程序初始化之後運送對象。在這種情況下, 訪問ExecutorAccessedObject.y時,理想情況下它不會調用println,而是返回值。這是一個高度簡化的版本,實際上,我想打電話給驅動程序上的某個外部系統,因此在執行程序上訪問時,它不會重新調用該外部系統。我確信@transient lazy val x在執行者上被重新初始化,因爲這將持有無法序列化的連接池。

object ExecutorAccessedObject extends Serializable { 
    @transient lazy val x: Int = { 
    println("Ok with initialzing this on the executor. I.E. database connection pool") 
    1 
    } 

    val y: Int = { 
    // call some external system to return a value. 
    // I do not want to call the external system from the executor 
    println(
     """ 
     |Idealy, this would not be printed on the executor. 
     |return value 1 without re initializing 
     """) 
    1 
    } 
    println("The constructor will be initialized Once on each executor") 
} 


someRdd.mapPartitions { part => 
    ExecutorAccessedObject 
    ExecutorAccessedObject.x // first time accessed should re-evaluate 
    ExecutorAccessedObject.y // idealy, never re-evaluate and return 1 
    part 
} 

我試圖用廣播變量解決這個問題,但我不確定如何訪問單例對象內的廣播變量。

沙发
0
2

我想知道的是,如果我可以在驅動程序初始化之後裝運對象。

你不能。作爲單身人士,我們絕不會將其運送給執行人。在本地初始化時,只要第一次訪問對象。

如果調用的結果是可序列化的,只需將其作爲參數傳遞給ExecutorAccessedObject(隱式或顯式地)或使ExecutorAccessedObject可變(並添加所需的同步)即可。

+0

謝謝你的回答。當你說明確地將參數傳遞給對象時,你的意思是使它成爲一個帶有參數的類? –

+0

我寧願考慮參數化方法調用。使用類而不是對象應該也可以。 – user8925690

0
votes
answers
37 views
+10

使用無形的類型級別過濾

2

有沒有人知道如何使用無形的測試工作。使用無形的類型級別過濾

package net.jtownson.swakka.jsonschema 

import org.scalatest.FlatSpec 
import org.scalatest.Matchers._ 

class OptionalFieldSpec extends FlatSpec { 

    case class A(i: Int, j: Option[Int]) 

    "an extractor of some kind" should "get the (non)optional fields from a case class" in { 

    extractNonOptionalFieldNames[A] shouldBe List("i") 

    extractOptionalFieldNames[A] shouldBe List("j") 

    } 

    def extractNonOptionalFieldNames[T <: Product](/* implicit typeclass instances? */): List[String] = ??? 

    def extractOptionalFieldNames[T <: Product]: List[String] = ??? 

} 

我有一個不運行時實例或它的仿製藥,因爲我在對的情況下A類,它是獨立於任何特定實例的創建工作JsonSchema。該模式有一個所需的字段,該字段是非可選字段的列表。例如

{ 
    "type" -> "object", 
    "required" -> ["i"], 
    "properties" -> { 
    "i" -> { 
     "type" -> "integer", 
     "format" -> "int32" 
    } 
    } 
} 
+0

你想'LabelledGeneric' - 這將使你的字段名的類型級證人,以及它們的類型。除此之外,似乎你只是想過濾這個HList。 – Alec

沙发
0
3

事情是這樣的:

trait FieldNameExtractor[T] extends Serializable { 
    import shapeless.ops.hlist.{RightFolder, ToTraversable} 
    import shapeless.ops.record.Keys 
    import shapeless.{HList, HNil, LabelledGeneric, Poly2} 

    /** 
    * Extracts filtered field names for type [[T]], 
    * given a polymorphic function that acts as the type filter 
    */ 
    def extract[L <: HList, R <: HList, O <: HList](op: Poly2)(
     implicit lgen: LabelledGeneric.Aux[T, L], 
     folder: RightFolder.Aux[L, HNil.type, op.type, R], 
     keys: Keys.Aux[R, O], 
     traversable: ToTraversable.Aux[O, List, Symbol] 
): List[String] = { 
    val result = keys().to[List] 
    result.map(_.name) 
    } 
} 

object FieldNameExtractor { 
    def apply[T] = new FieldNameExtractor[T] {} 
} 

用法:

import org.scalatest.FlatSpec 
import org.scalatest.Matchers._ 

class Test extends FlatSpec { 
    /* type filters */ 
    import shapeless.{HList, Poly2} 
    import shapeless.labelled.KeyTag, shapeless.tag.Tagged 

    type FilterO[A, T] = Option[A] with KeyTag[Symbol with Tagged[T], Option[A]] 

    trait Ignore extends Poly2 { 
    implicit def default[A, L <: HList] = at[A, L]((_, l) => l) 
    } 
    trait Accept extends Poly2 { 
    implicit def default[A, L <: HList] = at[A, L](_ :: _) 
    } 

    object allOptions extends Ignore { 
    implicit def option[A, T, L <: HList] = at[FilterO[A, T], L](_ :: _) 
    } 
    object noOptions extends Accept { 
    implicit def option[A, T, L <: HList] = at[FilterO[A, T], L]((_, l) => l) 
    } 

    "an extractor of some kind" should "get the (non)optional fields from a case class" in { 
    case class A(i: Int, j: Option[Int], k: String) 

    val fne = FieldNameExtractor[A] 
    fne.extract(noOptions) shouldBe List("i", "k") // extractNonOptionalFieldNames 
    fne.extract(allOptions) shouldBe List("j")  // extractOptionalFieldNames 
    } 
} 
+0

美麗。謝謝。其實,我認爲你發佈的第一個解決方案也很好。它的代碼少了幾行。 –

+0

我設法使它更加可重用和美觀。所有的「魔術」都發生在「提取」方法中;所以例如'extractOptionalFieldNames'實現只傳遞所需的參數:你自定義類型的值和作爲過濾器的多態函數('Poly' impl) –

+0

已修改,因此不需要'A'的運行時實例 –

板凳
0
2

這裏使用的一種方法類型類:

??3210

有可能需要幾件事情解釋:

  • 既然您提到您沒有運行時實例A。什麼是您想要回來的類型級別表示?在這個解決方案中,我只是返回了一個HList證人的選擇。我不認爲List[String]表示就足夠了,因爲過濾掉非可選值將具有與無所事事相同的類型。
  • 類型類有一個優先級,所以過濾選項與反向優先級相同。

它可以像這樣使用:

case class A(i: Int, j: Option[Int], k: Option[Long]) 
val x = LabelledGeneric[A] 
type filteredType = OptionExtractor[x.Repr] 
//type B = Symbol with shapeless.tag.Tagged[String("j")] :: Symbol with shapeless.tag.Tagged[String("k")] :: shapeless.HNil 
+0

乾杯,Jamborta。 (我提高了你的解決方案,但我沒有足夠的街道信譽來計算它,當我更高級時,我會回到它的位置:-) –

0
votes
answers
74 views
+10

IntelliJ無法找到Scala/SBT GetClassifiersModule

2

這裏是SBT的全新品牌,這可能是罪魁禍首。我試圖讓IntelliJ Community 2017.2導入我的a simple Scala/SBT projectIntelliJ無法找到Scala/SBT GetClassifiersModule

當您克隆該回購時,您可以(如果您需要)運行sbt compile和/或sbt run來驗證小小的Driver.scala源碼編譯並按預期運行。

但是當我試圖將其導入的IntelliJ:

enter image description here

enter image description here

enter image description here

enter image description here

糟糕!這是一個巨大的堆棧跟蹤但結尾:

[error]  at xsbt.boot.Launch$$anonfun$apply$1.apply(Launch.scala:35) 
[error]  at xsbt.boot.Launch$.launch(Launch.scala:117) 
[error]  at xsbt.boot.Launch$.apply(Launch.scala:18) 
[error]  at xsbt.boot.Boot$.runImpl(Boot.scala:41) 
[error]  at xsbt.boot.Boot$.main(Boot.scala:17) 
[error]  at xsbt.boot.Boot.main(Boot.scala) 
[error] java.lang.BootstrapMethodError: java.lang.NoClassDefFoundError: sbt/internal/librarymanagement/GetClassifiersModule 
[error] Use 'last' for the full log. 

任何想法是怎麼回事?我的項目中有什麼(見GH回購)跳出來?

沙发
0
0

貌似https://youtrack.jetbrains.com/issue/SCL-12336,這個問題是固定在2017.3,請嘗試2017.3 EAP https://www.jetbrains.com/idea/nextversion/

0
votes
answers
50 views
+10

Scala Slick擴展了其結構外的表的功能

0

我使用Slick代碼gen來輸出非常正常的Tables.scala文件,該文件映射了我的數據庫結構的表/列。Scala Slick擴展了其結構外的表的功能

但是我想告訴我的DAO及其證明這些表的功能是不可能的,我(約新Scala和發揮框架)

INSIDE Tables.scala在類會議 你可以寫可訪問列的功能IE

class Meeting(_tableTag: Tag) extends profile.api.Table[MeetingRow](_tableTag, "meeting") { 
def * = (id, dateandtime, endtime, organisationid, details, adminid, datecreated, title, agenda, meetingroom) <> (MeetingRow.tupled, MeetingRow.unapply) 
def ? = (Rep.Some(id), Rep.Some(dateandtime), Rep.Some(endtime), Rep.Some(organisationid), Rep.Some(details), Rep.Some(adminid), Rep.Some(datecreated), Rep.Some(title), Rep.Some(agenda), Rep.Some(meetingroom)).shaped.<>({r=>import r._; _1.map(_=> MeetingRow.tupled((_1.get, _2.get, _3.get, _4.get, _5.get, _6.get, _7.get, _8.get, _9.get, _10.get)))}, (_:Any) => throw new Exception("Inserting into ? projection not supported.")) 
val id: Rep[Int] = column[Int]("id", O.AutoInc, O.PrimaryKey) 
val dateandtime: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("dateandtime") 
val endtime: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("endtime") 
val organisationid: Rep[Int] = column[Int]("organisationid") 
val details: Rep[String] = column[String]("details", O.Default("")) 
val adminid: Rep[Int] = column[Int]("adminid") 
val datecreated: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]("datecreated") 
val title: Rep[String] = column[String]("title", O.Default("")) 
val agenda: Rep[String] = column[String]("agenda", O.Default("")) 
val meetingroom: Rep[Int] = column[Int]("meetingroom") 

def getAttendees = Tables.Meeting2uzer.filter(_.meetingid === id) 

其中上述函數中的「ID」是Meeting中的列。

現在問題出現了,當我想在我的DAO中寫入相同的函數「getAttendees」時,它無法訪問範圍中的列。

東西線沿線的....

@Singleton 
class SlickMeetingDAO @Inject()(db: Database)(implicit ec: ExecutionContext) extends MeetingDAO with Tables { 

    override val profile: JdbcProfile = _root_.slick.jdbc.PostgresProfile 
    import profile.api._ 

    private val queryById = Compiled((id: Rep[Int]) => Meeting.filter(_.id === id)) 

    def getAttendees = Meeting2uzer.filter(_.meetingid === "NEED ID OF COLUMN IN SCOPE") 

如何獲得「身份證」,這是在Tables.Meeting列在範圍上吾道完成這個getAttendees功能。

沙发
0
1

如果我理解正確,你想加入兩個表?

Meeting2uzer.join(Meeting).on(_.meetingid === _.id)

你的Tables.scala裏面做什麼,會更內嵌創造油滑的外鍵。您可以創建一個光滑的外鍵,而不是使用顯式連接。請參閱Slick here的文檔。

+0

謝謝,這正是我想要的。最後,儘管我決定退出Tables.scala自動生成的模型,只是將我的表結構分離到它們自己可管理的包中,並使用Tables.scala作爲指導。意味着我可以輕鬆地定製它,而無需編寫複雜的腳本 –

0
votes
answers
29 views
+10

如何AkkaSSLConfig

0

docshere提供設置HostnameVerifierClass,我嘗試使用下面的代碼來改變HostnameVerifierClass如何AkkaSSLConfig

val sslConfig = AkkaSSLConfig().mapSettings { s => 
    s.withHostnameVerifierClass(java.lang.Class[NoopHostnameVerifier]) 
    s 
} 
val badCtx = Http().createClientHttpsContext(sslConfig) 
Http().superPool[RequestTracker](badCtx)(httpMat) 

但我得到下面的錯誤與此:

Error:(83, 31) object java.lang.Class is not a value s.withHostnameVerifierClass(JJClass[NoopHostnameVerifier])

獲取從這個幫助answer,我把它改成:

val sslConfig = AkkaSSLConfig().mapSettings { s => 
    s.withHostnameVerifierClass(classOf[NoopHostnameVerifier]) 
    s 
} 

但是,這也不能編譯說:

Error:(83, 38) type mismatch;

found : Classorg.apache.http.conn.ssl.NoopHostnameVerifier

required: Class[javax.net.ssl.HostnameVerifier]

Note: org.apache.http.conn.ssl.NoopHostnameVerifier <: javax.net.ssl.HostnameVerifier, but Java-defined class Class is invariant in type T.

You may wish to investigate a wildcard type such as _ <: javax.net.ssl.HostnameVerifier . (SLS 3.2.10)

s.withHostnameVerifierClass(classOf[NoopHostnameVerifier])

我如何解決這個搞定,NoopHostnameVerifier實現接口HostnameVerifier,但還是這個錯誤來。

+0

你見過[這個問題(https://開頭github.com/lightbend/ssl-config/issues/46),它似乎是一回事。你使用的是最新版本的'ssl-config'嗎? – Kraylog

0
votes
answers
45 views
+10

理解階類型功能

0

一個簡單函數文本可以被寫爲理解階類型功能

DEF添加(X:強度)= X + 2

在上述例子中我明白添加是一個函數,它接受一個I??nt和給出一個Int。它的類型是add:(x:Int)Int

這很清楚。

但是下面的例子中,其是式期權[INT] =>內部是有點不清楚

scala> def matchFunction : Option[Int] => Int = { 
    | case Some(x) => x 
    | case None => 0 
    | } 
matchFunction: Option[Int] => Int 

在第二示例中,任何人都可以解釋爲什麼類型應該它不

def matchFunction (x : Option[Int]) : Int 

也請解釋什麼是上述功能並低於所述一個之間的差使用匹配從類型透視

def matchFunction (x : Option[Int]) : Int = x match { 
    case Some(x) => x 
    case None => 0 
} 
+0

'add'是一種方法不起作用。所以你想知道https://stackoverflow.com/questions/2529184/difference-between-method-and-function-in-scala – chengpohi

+0

@chengpohi,爲什麼要添加一個方法,但matchFunction的一個函數。兩者都是def,那麼爲什麼與另一個不同呢? – Srinivas

+0

'matchFunction'是一個無參數方法,所以你可以像使用變量一樣使用它,並且它返回一個'function'。等於:'def matchFunction():...' – chengpohi

沙发
0
1

基本上這是函數式編程方面之一:高階函數 - 將其他函數作爲參數或者其結果是函數的那些函數。 Option[Int] => Int是以Option[Int]作爲參數並返回Int的匿名函數,匿名函數始終可以使用def,def matchFunction(x : Option[Int]): Int = { ... }表示,def matchFunction(x : Option[Int]): Int = { ... }只是表示Option[Int] => Int = { ... }的另一個變體。高階函數對泛化,多態性很有用。所以你可以將你的matchFunction函數作爲參數來使用Option[Int] => Int函數。 List(Some(1), None, Some(2)).map(matchFunction)會給你List(1, 0, 2)

https://www.scala-exercises.org/scala_tutorial/higher_order_functions

+0

謝謝你的幫助。我現在知道了。 – Srinivas

0
votes
answers
54 views
+10

火花流:映射點到隊列

-1

我是新的火花流,我不明白地圖如何工作。我想從一個流排隊一些問題後,我從一個構造函數,因此我寫它傳遞的是:火花流:映射點到隊列

val data = inp.flatMap(_.split(",")) 
val points = data.map(_.toDouble) 
val queue: Queue[Point] = new Queue[Point] 
points.foreachRDD(rdd => { 
rdd.map(x => queue.enqueue(new Point(x,1))) 
}) 

當我打印隊列的大小始終爲零。

沙发
0
0

Spark中的所有轉換都是懶惰的,它們不會馬上計算結果。相反,他們只記得應用於某些基礎數據集的轉換。轉換僅在動作需要將結果返回給驅動程序時計算。

既然你在這裏申請地圖功能,它是一種懶洋洋地評估並不會computed.Instead,DAG的建立。只有在調用某個動作時纔會評估這一點。你可能想嘗試收集或任何其他行動來實現這一點。

你可以在這裏閱讀更多關於這個。它有點老,但內容豐富。 https://training.databricks.com/visualapi.pdf

0
votes
answers
91 views
+10

查詢在奎爾在運行時崩潰的語法錯誤

0

相關片段:查詢在奎爾在運行時崩潰的語法錯誤

case class Video(
    id: String, 
    title: String, 
    url: String, 
    pictureUrl: String, 
    publishedAt: Date, 
    channel: String, 
    duration: Option[String], 
    createdOn: Date 
) 

「連接」到DB工作,從預期的結果視頻臺返回選擇。我有儲蓄的問題,這個簡單的方法:

def saveToCache(item: Video): Unit = { 
    logger.trace(item) 
    import ctx._ 
    val x = quote { 
     val lItem = lift(item) 
     val fromDb = query[Video].filter(_.id == lItem.id) 
     if (fromDb.isEmpty) query[Video].insert(lItem) 
     else fromDb.update(lItem) 
    } 
    logger.trace(x.ast) 
    run(x) 
    } 

崩潰在運行時用(縮短):

CASE WHEN NOT EXISTS (SELECT x3.* FROM video x3 WHERE x3.id = ?) THEN INSERT INTO video (id,title,url,picture_url,published_at,channel,duration,created_on) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ELSE UPDATE video SET id = ?, title = ?, url = ?, picture_url = ?, published_at = ?, channel = ?, duration = ?, created_on = ? WHERE id = ? END 

我想:

11:14:06.640 [scala-execution-context-global-84] ERROR io.udash.rpc.AtmosphereService - RPC request handling failed 
org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near "CASE": syntax error) 
     at org.sqlite.core.DB.newSQLException(DB.java:909) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.core.DB.newSQLException(DB.java:921) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.core.DB.throwex(DB.java:886) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.core.NativeDB.prepare_utf8(Native Method) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.core.NativeDB.prepare(NativeDB.java:127) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.core.DB.prepare(DB.java:227) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.core.CorePreparedStatement.<init>(CorePreparedStatement.java:41) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.jdbc3.JDBC3PreparedStatement.<init>(JDBC3PreparedStatement.java:30) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.jdbc4.JDBC4PreparedStatement.<init>(JDBC4PreparedStatement.java:19) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.jdbc4.JDBC4Connection.prepareStatement(JDBC4Connection.java:48) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:263) ~[sqlite-jdbc-3.18.0.jar:na] 
     at org.sqlite.jdbc3.JDBC3Connection.prepareStatement(JDBC3Connection.java:235) ~[sqlite-jdbc-3.18.0.jar:na] 
     at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:317) ~[HikariCP-2.7.2.jar:na] 
     at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-2.7.2.jar:na] 
     at io.getquill.context.jdbc.JdbcContext.$anonfun$executeAction$1(JdbcContext.scala:98) ~[quill-jdbc_2.12-2.2.0.jar:2.2.0] 
     at io.getquill.context.jdbc.JdbcContext.$anonfun$executeAction$1$adapted(JdbcContext.scala:97) ~[quill-jdbc_2.12-2.2.0.jar:2.2.0] 
     at io.getquill.context.jdbc.JdbcContext.$anonfun$withConnection$1(JdbcContext.scala:46) ~[quill-jdbc_2.12-2.2.0.jar:2.2.0] 
     at scala.Option.getOrElse(Option.scala:121) ~[scala-library-2.12.2.jar:1.0.0-M1] 
     at io.getquill.context.jdbc.JdbcContext.withConnection(JdbcContext.scala:44) ~[quill-jdbc_2.12-2.2.0.jar:2.2.0] 
     at io.getquill.context.jdbc.JdbcContext.executeAction(JdbcContext.scala:97) ~[quill-jdbc_2.12-2.2.0.jar:2.2.0] 

從宏觀編譯過程中相關的輸出

啓用日誌記錄查詢,但我不知道如何去做(Quill文檔只是說了一些關於SLF4J的信息,這對我來說是無用的信息 - 我沒有看到任何日誌,我不知道要在SLF4J中搜索什麼內容OCS)。

到目前爲止,我對Quill感到非常失望 - 第一次在使用默認排序類型時,它會生成無效的排序查詢,現在這個。

+0

我修復了我的答案中的錯誤並添加了有關日誌記錄的信息。 – mixel

沙发
0
0

你應該重寫你的查詢:

import ctx._ 
def saveToCache(item: Video): Unit = { 
    if (ctx.run(query[Video].filter(_.id == lift(item.id)).isEmpty)) 
    ctx.run(query[Video].insert(lift(item))) 
    else ctx.run(query[Video].filter(_.id == lift(item.id)).update(lift(item))) 
() 
} 

因爲quote必須包含將被編譯成一個單一的查詢表達式。 此代碼將編譯爲三個查詢。

但更好地利用優化的版本:

import ctx._ 
def saveToCacheOptimized(item: Video): Unit = { 
    if (ctx.run(query[Video].filter(_.id == lift(item.id)).update(lift(item))) == 0) 
    ctx.run(query[Video].insert(lift(item))) 
() 
} 

其編譯成兩個查詢。

Quill使用SLF4J進行日誌記錄,您應該閱讀本項目文檔。啓用日誌記錄,你應該添加一些日誌記錄的後端,例如,logback

libraryDependencies ++= Seq(
    "ch.qos.logback" % "logback-classic" % "1.2.3" 
) 

應該爲剛剛記錄的查詢是不夠的。

+0

謝謝,它的工作:)。我可能對Quill的期望過高,也許是因爲我幾年前在ORM方面做了一些工作。但是,奎爾似乎更接近數據庫層,並不像我希望的那樣是傻瓜式的(規則「如果編譯它是正確的」顯然不在這裏,即使使用正確的類型它可能會失敗運行)。 – monnef

+0

其實它似乎是一個錯誤。我報告了它(https://github.com/getquill/quill/issues/974)。 – mixel