it-swarm.com.ru

Как преобразовать RDD на основе класса наблюдения в DataFrame?

Документация Spark показывает, как создать DataFrame из RDD, используя классы случаев Scala для вывода схемы. Я пытаюсь воспроизвести эту концепцию, используя sqlContext.createDataFrame(RDD, CaseClass), но мой DataFrame оказывается пустым. Вот мой код Scala:

// sc is the SparkContext, while sqlContext is the SQLContext.

// Define the case class and raw data
case class Dog(name: String)
val data = Array(
    Dog("Rex"),
    Dog("Fido")
)

// Create an RDD from the raw data
val dogRDD = sc.parallelize(data)

// Print the RDD for debugging (this works, shows 2 dogs)
dogRDD.collect().foreach(println)

// Create a DataFrame from the RDD
val dogDF = sqlContext.createDataFrame(dogRDD, classOf[Dog])

// Print the DataFrame for debugging (this fails, shows 0 dogs)
dogDF.show()

Вывод, который я вижу:

Dog(Rex)
Dog(Fido)
++
||
++
||
||
++

Что мне не хватает?

Спасибо!

9
sparkour

Все, что вам нужно, это просто

val dogDF = sqlContext.createDataFrame(dogRDD)

Второй параметр является частью Java API и ожидает, что ваш класс следует соглашению Java beans (getters/setters). Ваш класс дел не соответствует этому соглашению, поэтому свойство не обнаружено, что приводит к пустому DataFrame без столбцов.

15
Vitalii Kotliarenko

Вы можете создать DataFrame непосредственно из Seq экземпляров класса case, используя toDF следующим образом:

val dogDf = Seq(Dog("Rex"), Dog("Fido")).toDF
6
David Griffin

Подход Case Class не будет работать в режиме кластера. Это даст ClassNotFoundException классу случая, который вы определили. 

Преобразуйте его в RDD[Row] и определите схему вашего RDD с помощью StructField, а затем createDataFrame наподобие

val rdd = data.map { attrs => Row(attrs(0),attrs(1)) }  

val rddStruct = new StructType(Array(StructField("id", StringType, nullable = true),StructField("pos", StringType, nullable = true)))

sqlContext.createDataFrame(rdd,rddStruct)

toDF() не будет работать

0
Kamaldeep Singh