【问题标题】:How to convert a case-class-based RDD into a DataFrame?如何将基于案例类的 RDD 转换为 DataFrame?
【发布时间】:2016-08-28 12:16:43
【问题描述】:

Spark documentation 展示了如何从 RDD 创建 DataFrame,使用 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)
++
||
++
||
||
++

我错过了什么?

谢谢!

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql rdd


    【解决方案1】:

    你所需要的只是

    val dogDF = sqlContext.createDataFrame(dogRDD)
    

    第二个参数是 Java API 的一部分,并希望您的类遵循 Java bean 约定(getters/setters)。您的案例类不遵循此约定,因此未检测到任何属性,这会导致没有列的空 DataFrame。

    【讨论】:

    • 这行得通。我还必须将案例类的定义移到我的主函数之外,以避免error: No TypeTag available for Dog。谢谢!
    • 我明白了,很有趣,所以第二个参数只有在从 Java API 调用时才需要,scala 会自动检测应该转换为列的 Type 字段?
    • 只有当case class 移出main 时才有效。 @Vitalii,@sparkour .. 有什么解释为什么需要将 case class 移到 main 之外。
    • 我得到 abstract 是保留关键字,不能用作字段名称,因为我的案例类有 abstract 作为字段名称。任何解决方法。
    【解决方案2】:

    您可以使用toDF 直接从案例类实例的Seq 创建DataFrame,如下所示:

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

    【讨论】:

    • 记得添加 import spark.implicits._
    【解决方案3】:

    案例类方法在集群模式下不起作用。它会将ClassNotFoundException 提供给您定义的案例类。

    将其转换为 RDD[Row] 并使用 StructFieldcreateDataFrame 定义 RDD 的架构

    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() 也不起作用

    【讨论】:

    • 任何解释,为什么它不能在集群模式下工作?
    猜你喜欢
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-01-24
    • 2018-03-30
    相关资源
    最近更新 更多