2016-09-22 19 views
0

寄せ木張りのフォーマットを使用してHDStreamにDStreamを保存します。問題は、私のケースクラスがjoda.DateTimeを使用し、Spark SQLがこれをサポートしていないことです。たとえば、次のようにjoda.DateTimeのケースクラスのDStreamをSpark DataFrameに変換します

case class Log (timestamp: DateTime, ...dozen of other fields here...) 

しかし、私はエラーを得た:java.lang.UnsupportedOperationExceptionが:DFにRDDを変換しようとしたときに型org.joda.time.DateTimeのスキーマがサポートされていません。

def output(logdstream: DStream[Log]) { 
     logdstream.foreachRDD(elem => { 
      val df = elem.toDF() 
      df.saveAsParquet(...) 
     }); 
    } 

マイモデルは複雑で多くのフィールドを持っているので、joda.DateTimeを取り除くために異なるケースクラスを作成する必要はありません。別のオプションは、jsonから寄木張りに直接保存することですが、理想的ではありません。 joda.DateTimeからspark(スパークのデータフレームに変換)で使用するsql.Timestampへの自動変換を行う簡単な方法はありますか?

ありがとうございました。

答えて

0

それは少し冗長ですが、あなたは試しマッピングログSQL行をスパークする:

logdstream.foreachRDD(rdd => { 
    rdd.map(log => Row(
    log.timestamp.toDate, 
    log.field2, 
    ... 
)).toDF().saveAsParquest(...) 
}) 
+0

こんにちは、私が正しくあなたを理解していればわかりません。しかし、次の文でエラーが発生します。val df = elem.toDF();つまり、.toDF()関数を使用してRDD [ログ]をデータフレームに変換できません。あなたの提案されたソリューションは、dfがすでに利用可能であると仮定しているようです。 – auxdx

+0

あなたは正しいです、私はそれを逃しました。私は答えを変えました。 – bear911

関連する問題