2016-04-20 19 views
1

私はテスト目的で必要な大量のケースクラスを作成しました。私はこれらの声明の多くをしています:Spark 1.4.1とScala:ScratchからDataFrameを作成

case class Bar(id: Int, desc: String) 
val foo = Bar(1, "baz") 
val bar = sc.makeRDD(Array(foo)).toDF 

それは動作します。私は機能を作成するために素敵なことだろうと思ってこれらの呼び出しの多くをやっているので:

def dfify[T: ClassTag](obj: T): DataFrame = sc.makeRDD(Array(obj)).toDF 

しかし、それは私に次のエラーを与える:

error: value toDF is not a member of org.apache.spark.rdd.RDD[T] 

私が追加しようとしました文脈に拘束されたT <:少し異なる文脈で提案されたhereのような製品ですが、それは助けになりません。

問題は、機能がなければ動作しますが、反復ビットのいくつかをやや簡略化しておくとよいでしょう。 1分と思っていたものは、結果がかなり出てきました。

私はSpark 1.4.1を使用していますが、変更できませんので、createDataFrame()は利用できません。

アイデア?

答えて

0

あなたはまたSQLContextを作成し、その暗黙をインポートする必要があり、そうでなければ(toDF方法を有する)DataFrameHolderRDDの暗黙的な変換は、スコープ内にありません。

もう1つの問題は、ClassTagでは不十分です。TypeTagも必要です。

このコードはコンパイルして動作します:

import scala.reflect.runtime.universe._ 
import scala.reflect.ClassTag 

val sqlContext = new SQLContext(sc) 
import sqlContext.implicits._ 

def dfify[T <: Product : ClassTag : TypeTag](obj: T): DataFrame = sc.makeRDD(Array(obj)).toDF() 
関連する問題