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: 25

0
votes
answers
29 views
+10

單獨的數據庫或新表

0

有我的應用程序,例如不同的模塊 -單獨的數據庫或新表

  1. 內容管理
  2. 費用管理和支付
  3. 調度管理

是什麼爲上述場景創建架構的最佳方法 -

  1. 有單獨的表
  2. 有獨立的DB每個

什麼是可擴展性,代碼的可維護性和企業的角度而言的優勢/劣勢?

沙发
0
1

根據以下問題做出決定。

這些不同的數據集有多相關。

你想對數據做什麼?它是出於某種目的(如分析)還是僅通過某些應用程序通過Web提供內容?

現在aws或gcp本身爲內容管理和調度提供了相當多的服務,您可能需要根據自己的數據庫設置和所有內容自行構建費用管理。

0
votes
answers
10 views
+10

Spark - 爲什麼ArrayBuffer似乎獲取尚未遍歷的元素

0

爲什麼MapPartition中的ArrayBuffer似乎具有尚未遍歷的元素?Spark - 爲什麼ArrayBuffer似乎獲取尚未遍歷的元素

例如,我看這段代碼的方式,第一項應該有1個元素,第二個2,第三個3等等。第一個ArrayBuffer輸出可能有9個項目。這似乎意味着在第一次輸出之前有9次迭代,但收益計數清楚地表明這是第一次迭代。

val a = ArrayBuffer[Int]() 
for(i <- 1 to 9) a += i 
for(i <- 1 to 9) a += 9-i 
val rdd1 = sc.parallelize(a.toArray()) 

def timePivotWithLoss(iter: Iterator[Int]) : Iterator[Row] = { 
    val currentArray = ArrayBuffer[Int]() 
    var loss = 0 
    var yields = 0 
    for (item <- iter) yield { 
     currentArray += item 
     //var left : Int = -1 
     yields += 1 
     Row(yields, item.toString(), currentArray) 
    } 
} 

rdd1.mapPartitions(it => timePivotWithLoss(it)).collect() 

輸出 -

[1,1,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[2,2,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[3,3,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[4,4,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[5,5,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[6,6,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[7,7,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[8,8,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[9,9,ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)] 
[1,8,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
[2,7,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
[3,6,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
[4,5,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
[5,4,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
[6,3,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
[7,2,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
[8,1,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
[9,0,ArrayBuffer(8, 7, 6, 5, 4, 3, 2, 1, 0)] 
沙发
0
1

這是因爲在分隔使用參照同可變對象的所有行。溢出到光盤可能進一步使它不確定,某些對象被序列化並且不能反映這些變化。

可以使用可變引用和不可變對象:

def timePivotWithLoss(iter: Iterator[Int]) : Iterator[Row] = { 
    var currentArray = Vector[Int]() 
    var loss = 0 
    var yields = 0 
    for (item <- iter) yield { 
    currentArray = currentArray :+ item 
    yields += 1 
    Row(yields, item.toString(), currentArray) 
    } 
} 

但總體可變狀態和火花都沒有很好的搭配。

0
votes
answers
12 views
+10

案例類toString與Iterable特徵糾纏?

4

看起來,如果案例類延伸Iterable[T],則toString方法發生更改。案例類toString與Iterable特徵糾纏?

case class MyPoint(x: Int, y: Int) 

case class MyOtherPoint(x: Int, y: Int) extends Iterable[Double] { 
    def iterator: Iterator[Double] = Iterator.fill(4)(1.0) 
} 

object Main extends App { 
    val my_pt = MyPoint(4,5) 
    println(my_pt) // MyPoint(4,5) 
    // println(my_pt.iterator) // ERROR, iterator is not a member of MyPoint 
    val my_other_pt = MyOtherPoint(4, 5) 
    println(my_other_pt) // MyOtherPoint(1.0, 1.0, 1.0, 1.0) 
    println(my_other_pt.productIterator.toList) // List(4, 5) 
} 

這似乎是相當不幸的,特別是考慮到雖然case類默認擴展Product,從而有productIterator,他們不是想延長Iterable

這是Scala編譯器中的錯誤嗎?

沙发
0
2

這是Scala編譯器中的錯誤嗎?

不,這是(section §5.3.2,重點煤礦)在規範中定義的行爲:

每個案例類隱式覆蓋類的一些方法定義 scala.AnyRef除非同一方法的定義是已經在案例類本身給出了 ,或者在與AnyRef不同的案例類的某些基類中給出了相同方法 的具體定義。 特別是:

  • 方法toString:String返回包含 的類和它的元素的名稱的字符串表示。

你看到的是Iterable繼承TraversableLike,它具有以下toString重寫結果:

override def toString = mkString(stringPrefix + "(", ", ", ")") 

而且,如果你Xprint:jvm下編譯,你可以看到MyOtherPoint繼承了許多方法,包括被覆蓋toString

case class MyOtherPoint extends Object with Iterable with Product with Serializable { 
    // removed all other methods for brevity 
    override def toString(): String = MyOtherPoint.super.toString(); 
} 
板凳
0
0

您可以使用以下方法重新定義toString方法:

case class MyOtherPoint(x: Int, y: Int) extends Iterable[Double] { 
    def iterator: Iterator[Double] = Iterator.fill(4)(1.0) 
    override def toString(): String = 
    productIterator.mkString(productPrefix + "(", ",", ")") 
} 
50
votes
answers
10 views
+10

What does addScalar do?

The JavaDoc says:

SQLQuery org.hibernate.SQLQuery.addScalar(String columnAlias, Type type)

Declare a scalar query result

I know what executeScalar is in C#, but this scalar and C# scalar seem to be absolutely different.

up vote 31 down vote accepted favorite
沙发
+310
+50

這是聲明您希望查詢的結果返回單個命名列的對象,而不是實體。例如

  createSQLQuery(“SELECT COUNT(*)AS c FROM Users”)。addScalar(“c”)。uniqueSesult()  

將返回一個 Long 如果指定多個標量,結果將作為 Object 的數組返回。它類似於 executeScalar ,除了它適用於命名列,並且可以返回複合結果。

+150

為了避免使用ResultSetMetadata的開銷,或者只是為了更明確地返回什麼,可以使用addScalar():

  session.createSQLQuery(“SELECT * FROM CATS”) .addScalar(“ID”,Hibernate.LONG).addScalar(“NAME”,Hibernate.STRING).addScalar(“BIRTHDATE”,Hibernate.DATE)  

此查詢指定:

  SQL查詢字符串要返回的列和類型  

這將返回Object數組,但現在它不會使用ResultSetMetadata,而是顯式獲取ID, NAME和BIRTHDATE列分別為底層結果集的Long,String和Short。這也意味著只返回這三列,

@IrfanNasim:在最近的Hibernate版本中,這些類型字段似乎已被棄用。看看這個答案。現在您應該使用LongType.INSTANCE而不是Hibernate.LONG。 - Michi 2015年9月2日9:48

@Evan是否有一種方法我只能為某些列執行addScalar(columnName,type),但查詢結果應該包含所有字段,因為我在select查詢中指定了*?所以我的問題是,在我的PostgreSQL中,該字段的數據類型是bigserial,並且在我的Java代碼中轉換為BigInteger。但是我的POJO類將這些字段設置為Long,所以我使用addScalar(...)指定了那些Long字段的類型,但現在我的查詢只返回那些有限的字段。我無法找到出路。任何的想法 ? - mantri於2017年3月21日在10:52

+40

addScalar 是SQL查詢中給定鍵的returnType信息。

示例:

 查詢a = new SqlQuery(“從用戶選擇用戶名為un,其中...“); a.addScalar(“un”,String);   

如果查詢結果,如果指定,結果將為String或其他類型。

0

當你的bean有多個帶有diff類型的字段並且你想從mysql中獲取相同類型的這些字段時,就會使用它。例如。

  public class Example {Long id; 字符串名稱; }   

你可以使用add scalar,如下所示

  session.createSQLQuery(“SELECT * FROM tableName”)。addScalar(“id”,Hibernate.LONG ).addScalar(“name”,Hibernate.STRING);  
     
			
        
0
votes
answers
63 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

0
votes
answers
26 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
34 views
+10

訪問私有變量在斯卡拉測試沒有鑄造

0

我需要你的幫助,我有這個斯卡拉問題。訪問私有變量在斯卡拉測試沒有鑄造

我有一個類的層次結構:車輛只有每個車輛的共同變量,然後是3個子類:Car,Truck和MotorCycle,每個人都有自己的特定變量。 我使用模式匹配在輔助對象的方法來做這取決於車輛的類型的一些變換:

object Transformation { 
    def someTransformation(vehicle:Vehicle):Vehicle = { 
     vehicle match { 
      case Car(<<<vars>>>) => Car(<<< transformed vars>>>) 
      case Truck(<<<vars>>>) => Truck(<<< transformed vars>>>) 
      case MotorCycle(<<<vars>>>) => MotorCycle(<<< transformed vars>>>) 
     } 
    } 
} 

我的問題是,當我必須測試它,因爲我返回一個車輛(可以說一個混合),我必須在每次出現時都施放以便獲得所涉及的車輛的私人汽車。 我想離開這段代碼的樣子,並且在測試過程中訪問私有成員而不投射,知道我作爲參數收到的車輛與我返回的車輛類型相同。 這可以通過泛型來解決嗎?如何?

謝謝,我希望它是可以理解的。

+0

我猜你真的不意味着該類的'private'成員,繼承特定的公正? – Kraylog

+0

恰恰是尼姆羅德阿爾戈夫 –

沙发
0
1

我認爲你想要做的是對函數someTransformation的返回類型進行限制。你想someTransformation只返回它被調用的車輛的類型。

這裏是你如何通過上下文範圍做到這一點:

trait Vehicle 
case class Car(a: Int) extends Vehicle 
case class Truck(b: Int) with Vehicle 
case class MotorCycle(c: Int) with Vehicle 

object Transformation { 
    trait Transformer[V <: Vehicle] { 
    def transform(v: V): V 
    } 

    implicit val carTransformer = new Transformer[Car] { 
    override def transform(c: Car): Car = Car(c.a + 1) 
    } 

    implicit val truckTransformer = new Transformer[Truck] { 
    override def transform(t: Truck): Truck = Truck(t.b + 10) 
    } 

    implicit val motorCycleTransformer = new Transformer[MotorCycle] { 
    override def transform(m: MotorCycle): MotorCycle = MotorCycle(m.c + 100) 
    } 

    def someTransformation[V <: Vehicle : Transformer](v: V): V = { 
    implicitly[Transformer[V]].transform(v) 
    } 
} 

Transformation.someTransformation(Car(1)) // results in Car(2) 
Transformation.someTransformation(Truck(1)) // results in Truck(11) 
Transformation.someTransformation(MotorCycle(1)) // results in MotorCycle(101) 
0
votes
answers
26 views
+10

如何將行轉換爲火花數據幀中的列,scala

0

有什麼方法可以將數據幀行轉置爲列。 我有以下結構作爲輸入:如何將行轉換爲火花數據幀中的列,scala

val inputDF = Seq(("pid1","enc1", "bat"),("pid1","enc2", ""),("pid1","enc3", ""),("pid3","enc1", "cat"),("pid3","enc2", "")).toDF("MemberID", "EncounterID", "entry") 

inputDF.show: 

+--------+-----------+-----+ 
|MemberID|EncounterID|entry| 
+--------+-----------+-----+ 
| pid1|  enc1| bat| 
| pid1|  enc2|  | 
| pid1|  enc3|  | 
| pid3|  enc1| cat| 
| pid3|  enc2|  | 
+--------+-----------+-----+ 

expected result: 

+--------+----------+----------+----------+-----+ 
|MemberID|Encounter1|Encounter2|Encounter3|entry| 
+--------+----------+----------+----------+-----+ 
| pid1|  enc1|  enc2|  enc3| bat| 
| pid3|  enc1|  enc2|  null| cat| 
+--------+----------+----------+----------+-----+ 

請建議是否有可用的轉置行到列的任何優化的直接API。 我的輸入數據量是相當大的,所以像collect這樣的動作,我無法執行,因爲它會佔用驅動程序上的所有數據。 我正在使用Spark 2.x

+0

如果'entry'具有所有3個'EncounterID'的值,該怎麼辦?只能有3個'EncounterID'嗎? – philantrovert

+0

條目將只有一個值。並且是EncounterID是固定的,將只有3個EncounterID。 – Kalpesh

+1

你確定這是你期望的結果嗎?所有三個Encounter列總是具有相同的值... – Oli

沙发
0
0

我不確定您需要的是您實際詢問的內容。然而,以防萬一這裏是一個想法:

val entries = inputDF.where('entry isNotNull) 
    .where('entry !== "") 
    .select("MemberID", "entry").distinct 

val df = inputDF.groupBy("MemberID") 
    .agg(collect_list("EncounterID") as "encounterList") 
    .join(entries, Seq("MemberID")) 
df.show 
+--------+-------------------------+-----+ 
|MemberID|   encounterList |entry| 
+--------+-------------------------+-----+ 
| pid1|  [enc2, enc1, enc3]| bat| 
| pid3|    [enc2, enc1]| cat| 
+--------+-------------------------+-----+ 

列表的順序是不確定的,但你可以對它進行排序,然後從它.withColumn("Encounter1", sort_array($"encounterList")(0))提取新列...

其他的想法

如果你想要的是擺在相應的「遭遇」列項的值,你可以使用透視:

inputDF 
    .groupBy("MemberID") 
    .pivot("EncounterID", Seq("enc1", "enc2", "enc3")) 
    .agg(first("entry")).show 

+--------+----+----+----+ 
|MemberID|enc1|enc2|enc3| 
+--------+----+----+----+ 
| pid1| bat| | | 
| pid3| cat| | | 
+--------+----+----+----+ 

Seq("enc1", "enc2", "enc3")添加爲optionnal,但由於您知道列的內容,因此它將加速計算。

+0

對不起,我不能夠硬編碼的值,這將取決於列中有什麼值。還有一件事我錯過了添加..如果對於特定的memberID只有2行可用,那麼代碼應該能夠將第三列標記爲空。 ..我會更新這個問題 – Kalpesh

0
votes
answers
21 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
41 views
+10

通過SBT進行Docker化Scala應用程序的Marathon Healthcheck

-2

我正在使用Marathon和Mesos。我的應用程序基於Scala,我正在使用SBT docker插件來dockerize應用程序並部署到Marathon。應用程序是異步的(基於隊列),並且不通過HTTP調用。如何爲異步應用程序執行健康檢查,並且可以在此處利用SBT Scalatest。該應用程序是dockerized的,所以我們如何在dockerized應用程序中調用Scalatest。有什麼想法嗎 ?通過SBT進行Docker化Scala應用程序的Marathon Healthcheck

+0

投票關閉作爲題外話,因爲它基本上要求的教程,這是外的範圍。話雖如此,這可能對你有幫助:https://skillsmatter.com/skillscasts/11183-integration-testing-using-sbt-scalatest-and-docker – theFunkyEngineer

+0

這是一次在馬拉松上運行還是永久運行在馬拉松上? – Rico

+0

它永久運行在馬拉松上。一次運行,我通過命令「sbt docker」執行。我配置的Scalatest案例將運行並創建圖像。問題是在部署到Marathon之後,我如何在異步應用程序上使用馬拉松的運行狀況檢查功能。 –

沙发
0
0

您可以使用Command HealthCheck並執行您的自定義命令。

想想你是否真的需要健康檢查以及它會告訴你什麼。避免進行健康檢查,以更好地利用資源,暴露將監視線程池的終端,超時e.t.c.並且當某些事情真的錯誤時會返回不健康的狀態。在其他情況下,您應該配置您的指標以通知您發生了不良事件。

Process health checking (「is this binary responding at all?」) and service health checking (「is this binary able to respond to this class of requests right now?」) are two conceptually distinct operations. Process health checking is relevant to the cluster scheduler, whereas service health checking is relevant to the load balancer. Clearly distinguishing between the two types of health checks can help avoid this scenario.

+1

謝謝大家。現在我寫了一個啞健康檢查HTTP服務。 –