2016-09-02 5 views
6

私は頻繁にSparkを扱います。コンパイラが型がシリアライザ可能であることが保証されていれば、時間が大幅に節約できます。コンパイル時に型がシリアライザブルであることを保証する方法はありますか?

おそらくタイプクラスですか?

def foo[T: IsSerializable](t: T) = { 
    // do stuff requiring T to be serializable 
} 

T <:シリアライズ可能ではありません。それは実行時に失敗する可能性があります。単体テストは良い代用品ですが、特に大きなチームと一緒に作業する場合は、それらを忘れることがあります。

これは、コンパイル時にタイプがシールされていないと、おそらく不可能だと思います。

+0

サイド質問:T <:シリアライズ可能なのはコンパイル時の保証のみですか? – Samar

+0

あなたは精緻化できますか?はい、コンパイル時にチェックされる制約です。 – Upio

+0

しかし、ランタイム保証を提供していない場合、強力な型システムを持つことのポイントは何ですか? – Samar

答えて

4

はい、可能ですが、あなたが望んでいる方法ではありません。あなたの型クラスIsSerializableは、あなたのTは再びSerializableバックするを保証されて型の値に変換するためのメカニズムを提供

trait IsSerializable[T] { 
    def toSerializable(t: T): String 
    def fromSerializable(s: String): Option[T] 
} 

しかし、もちろん、これはベースだけで、代替型クラスである可能性がありJVMのシリアル化を冗長化することで、それ自体のシリアル化メカニズムが実現します。

あなたの最善の行動は、タイプクラスに基づく直列化を直接サポートするためにSparkをロビーにすることです。

+0

応答がありがとう、しかし、あなたは正しい、これは私が望んでいたものではありません:)スパークがJavaのシリアライズから遠ざかった場合、どのようにクロージャをシリアライズしますか?型クラスを持つデータオブジェクトの直列化を解決するのは簡単ですが、計算ロジックは可能ではないようです。ほとんどのSparkアプリケーションは、怠け者やその他の回避策を使ってシリアライズの問題を解決しているため、残念です。 – Upio

関連する問題