2017-08-05 10 views
0

私はrddを取り、それをavroファイルとして保存するメソッドを書いています。問題は、私が行うことができるよりも特定のタイプを使用すると.toDF()ですが、.toDF()を汎用rddに呼び出すことはできません!ここでは一例です:私は、一般的なRDDに.toDF()を呼び出し、その周りにどのような方法があるかどうかできない理由汎用rddをデータフレームに変換する方法は?

case class Person(name: String) 

def f(x: RDD[Person]) = x.toDF() 
def g[T](x: RDD[T]) = x.toDF() 

f(p) //works 
g(p) //fails!! 

誰でも知っていますか?

+0

'.toDf'を関数' g() 'を書く必要があるのは難しいですか? –

+0

RDDをどうやって始めましたか? DataFrame(またはSpark2のDataSet)を取得する代替手段はありません –

+0

@ cricket_007 'f'と' g'は私が書いている実際の関数ではありません。チェックポイントなどの追加機能をRDDでラップする関数を作成して、データが既に生成されている場合はロードできます。それ以外の場合はDAGをトリガーしてデータセットを生成し、ディスクに保存します。 Dataframeに保存できるフォーマットはいくつかありますが、RDDには 'saveAsTextFile'と' saveAsObject'(オブジェクトの意味)があります。 – anthonybell

答えて

1

あなたがスパーク2を使用している場合は、

import org.apache.spark.sql.Encoder 

def g[T: Encoder](x: RDD[T]) = x.toDF() 

は動作します。

toDFが達成しorg.apache.spark.sql.SQLImplicits

implicit conversion

implicit def rddToDatasetHolder[T : Encoder](rdd: RDD[T]): DatasetHolder[T] = { 
    DatasetHolder(_sqlContext.createDataset(rdd)) 
} 

によって追加方法で、署名が同じでなければなりません。

関連する問題