2016-09-01 6 views
3

Spark 2.xを使用すると、ケースクラスで構成されるRDDのRDDを使用してDataframeを作成できないようです。ケースクラスを使用してRowのRDDからデータフレームを作成できません

これは、Spark 1.6.xの上の仕事の罰金をしましたが、2.xの上で以下のランタイム例外失敗:触媒から生成されたコードの束が先行

java.lang.RuntimeException: Timestamp is not a valid external type for schema of struct<seconds:bigint,nanos:int> 

を。ここで

はスニペット(私がやっているものの簡易版)です:

package main 

import org.apache.spark.sql.{SparkSession, Row} 
import org.apache.spark.sql.types.{IntegerType, LongType, StructField, StructType} 

object Test { 

    case class Timestamp(seconds: Long, nanos: Int) 

    val TIMESTAMP_TYPE = StructType(List(
    StructField("seconds", LongType, false), 
    StructField("nanos", IntegerType, false) 
)) 

    val SCHEMA = StructType(List(
    StructField("created_at", TIMESTAMP_TYPE, true) 
)) 

    def main(args: Array[String]) { 

    val spark = SparkSession.builder().getOrCreate() 

    val rowRDD = spark.sparkContext.parallelize(Seq((0L, 0))).map { 
     case (seconds: Long, nanos: Int) => { 
     Row(Timestamp(seconds, nanos)) 
     } 
    } 

    spark.createDataFrame(rowRDD, SCHEMA).show(1) 
    } 
} 

私は、これはスパークバグまたは私はドキュメントに逃した何かあれば(私はスパーク2.xは導入知ってわかりませんずっと

答えて

5

を高く評価し、ランタイム行エンコーディングの検証、多分これが関連している)

ヘルプ私はそれがバグであるかどうかわからないが、動的にを入力混合、ケースクラスと明示的なスキーマは、あまり意味がありません。 Rowsとスキーマを使用するか:

import collection.mutable._ 
import collection.JavaConverters._ 

spark.createDataFrame(ArrayBuffer(Row(Row(0L, 0))).asJava, SCHEMA) 

またはケースクラス:

import spark.implicits._ 

Seq(Tuple1(Timestamp(0L, 0))).toDF("created_at") 

そうでなければあなたは2回だけ同じ仕事をやっています。

あなたがOptionsを使用NULL可能フィールドができることを表現したい場合。例えば

case class Record(created_at: Option[Timestamp]) 
case class Timestamp(seconds: Long, nanos: Option[Int]) 

Seq(Record(Some(Timestamp(0L, Some(0))))).toDF 

created_atcreated_at.millisecondsNULLすることができスキーマを生成しますが、created_at.secondscreated_atNULLない場合に設定する必要があります。

+0

私は、特定のフィールドのセットを持つ既存の寄木細工のスキーマを扱っているので、明示的なスキーマを使用する必要があります。私はRow of Rowのことを知りませんでした。これを試してみましょう。ありがとう – cerisier

+0

実際には、大文字小文字の区別を使ってnull値を表現できます。 – zero323

+0

編集していただきありがとうございます。私は行の行と一緒にケースクラスなしで行ったが、これは最も理想的な解決策ではないと理解していますが、基本的な寄木細工のスキーマはnullableとnon nullableの奇妙な構成を持っているので、再度、感謝します。 – cerisier

関連する問題