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は導入知ってわかりませんずっと
私は、特定のフィールドのセットを持つ既存の寄木細工のスキーマを扱っているので、明示的なスキーマを使用する必要があります。私はRow of Rowのことを知りませんでした。これを試してみましょう。ありがとう – cerisier
実際には、大文字小文字の区別を使ってnull値を表現できます。 – zero323
編集していただきありがとうございます。私は行の行と一緒にケースクラスなしで行ったが、これは最も理想的な解決策ではないと理解していますが、基本的な寄木細工のスキーマはnullableとnon nullableの奇妙な構成を持っているので、再度、感謝します。 – cerisier