从RDD创建数据框[类]

时间:2019-02-20 17:46:46

标签: scala apache-spark dataframe rdd

我的火花代码中有一个RDD[Person],我想将此rdd转换为dataframe。 Person类不是案例类,它是常规的Scala类。我知道案例类,但无法从常规scala类转换。请帮助

1 个答案:

答案 0 :(得分:1)

Scala 2.11中修复了案例类中22个字段的限制。可以创建包含22个以上字段的案例类:

// 23 letters of the English alphabet
scala> case class Large(
     |   a: Int, b: Int, c: Int, d: Int,
     |   e: Int, f: Int, g: Int, h: Int,
     |   i: Int, j: Int, k: Int, l: Int,
     |   m: Int, n: Int, o: Int, p: Int,
     |   q: Int, r: Int, s: Int, t: Int,
     |   u: Int, v: Int, w: Int)

它可以与常用的Spark DataFrame API配合使用:

  import org.apache.log4j.{Level, Logger}
  import org.apache.spark.sql.SparkSession
  Logger.getLogger("org").setLevel(Level.ERROR) // Silencing trash
  val spark = SparkSession
    .builder
    .master("local")
    .appName("test")
    .getOrCreate()

  import spark.implicits._
  val sc = spark.sparkContext

  case class Large(
                    a: Int, b: Int, c: Int, d: Int,
                    e: Int, f: Int, g: Int, h: Int,
                    i: Int, j: Int, k: Int, l: Int,
                    m: Int, n: Int, o: Int, p: Int,
                    q: Int, r: Int, s: Int, t: Int,
                    u: Int, v: Int, w: Int)

  val large = Large(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23)

  val lettersDF: DataFrame = spark.sparkContext.parallelize(Seq(large)).toDF()
  lettersDF.show()

但是对于具有22个以上字段的案例类有两个限制:Large.tupledLarge.unapply无法访问。这些方法在Large上不存在。

如果这些限制对您来说至关重要,则可以使用workaround-以编程方式指定架构。

官方文件报价:

  

如果案例类无法提前定义(例如,   记录的结构编码为字符串,否则文本数据集为   解析的字段对不同用户的投影方式会有所不同),   可以通过三个步骤以编程方式创建DataFrame。

     
      
  • 从原始RDD创建行的RDD;
  •   
  • 在第1步中创建的RDD中,用StructType表示的模式与Rows的结构匹配。
  •   
  • 通过SparkSession提供的createDataFrame方法将架构应用于行的RDD。
  •   

基本上,您必须为相应的类创建一个架构并将其应用于行。您可以在上面的链接中找到示例。

HTH