2015-09-15 21 views
6

DataFrameでカスタムメソッドを定義する必要があります。それを行う良い方法は何ですか?かなりの数のカスタムメソッドを定義しようとしているので、ソリューションはスケーラブルでなければなりません。DataFrameにカスタムメソッドを定義する最も良い方法は何ですか?

私の現在のアプローチは、その中で私のカスタムメソッド(customMethod言う)を定義し、MyClassDataFrameを変換し、暗黙的なメソッドを定義し、パラメータとしてDataFrameで(たとえばMyClass)クラスを作成することです。

implicit def dataFrametoMyClass(df: DataFrame): MyClass = new MyClass(df) 

したがって、私は呼び出すことができます。

dataFrame.customMethod() 

これはそれを行うための正しい方法ですか?提案のために開きます。

答えて

10

あなたの方法は行く方法です([1]を参照)。私はそれが少し異なる解決していても、アプローチは同様のまま:

可能性1つの

暗黙

object ExtraDataFrameOperations { 
    object implicits { 
    implicit def dFWithExtraOperations(df: DataFrame) = DFWithExtraOperations(df) 
    } 
} 

case class DFWithExtraOperations(df: DataFrame) { 
    def customMethod(param: String) : DataFrame = { 
    // do something fancy with the df 
    // or delegate to some implementation 
    // 
    // here, just as an illustrating example: do a select 
    df.select(df(param)) 
    } 
} 

使用

DataFrame上の新しいcustomMethodメソッドを使用するには、次の

import ExtraDataFrameOperations.implicits._ 
val df = ... 
val otherDF = df.customMethod("hello") 

可能性2

代わりのimplicit method(上記参照)、あなたもimplicit classを使用することができます使用して:あなたはケースで

暗黙のクラス

object ExtraDataFrameOperations { 
    implicit class DFWithExtraOperations(df : DataFrame) { 
    def customMethod(param: String) : DataFrame = { 
     // do something fancy with the df 
     // or delegate to some implementation 
     // 
     // here, just as an illustrating example: do a select 
     df.select(df(param)) 
    } 
    } 
} 

使用

import ExtraDataFrameOperations._ 
val df = ... 
val otherDF = df.customMethod("hello") 

備考

を追加しないようにしたいimportobjectExtraDataFrameOperationspackage objectに変更し、パッケージ内のpackage.scalaというファイルに保存します。

公式ドキュメント/参照

[1] M. Odersky著によるオリジナルのブログ "ポン引き私のライブラリは" http://www.artima.com/weblogs/viewpost.jsp?thread=179766

6

でご利用いただけやや単純なアプローチがあります:ちょうどdeclare MyClass as implicit

implicit class MyClass(df: DataFrame) { def myMethod = ... } 
は、

暗黙の変換方法(MyClassとも呼ばれます)が自動的に作成されます。 extends AnyValを追加することでvalue classにすることもできます。これにより、実行時に実際にMyClassインスタンスを作成しないことでオーバーヘッドを避けることができますが、これは実際問題ではありません。

最後に、MyClasspackage objectに入れると、MyClassのインポートを必要とせずに、このパッケージのどこにでも新しいメソッドを使用できるようになります。これは利点または欠点の可能性があります。

0

DataFrameとカスタムラッパーの間に暗黙的な変換を追加する必要がありますが、暗黙的なclasを使用することをお勧めします。これは最も簡単に使用する必要があり、カスタムメソッドを共通の場所に保存します。

implicit class WrappedDataFrame(val df: DataFrame) { 
     def customMethod(String arg1, int arg2) { 
      ...[do your stuff here] 
     } 
    ...[other methods you consider useful, getters, setters, whatever]... 
     } 

暗黙のラッパーはデータフレームの範囲内にある場合、それはあなたのラッパーであるかのように、あなただけの通常のデータフレームを使用することができ、すなわち:

df.customMethod(「テスト」、100)

関連する問題