从rdd[class]创建Dataframe

zysjyyx4  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(342)

有一个 RDD[Person] 我想把这个rdd转换成 dataframe . person类不是case类,而是常规的scala类。我知道case类,但我无法从常规scala类转换。请帮忙

yduiuuwa

yduiuuwa1#

case类中22个字段的限制在scala2.11中被修复。可以创建一个包含22个以上字段的case类:

// 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)

它可以与常用的sparkDataframeapi配合使用:

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+个字段的case类有两个限制: Large.tupled 以及 Large.unapply 无法访问。这些方法在计算机上不存在 Large .
如果这些限制对您来说是至关重要的,那么有一个解决方法—通过编程指定模式。
引用官方文件:
如果不能提前定义case类(例如,将记录的结构编码为字符串,或者对文本数据集进行解析,并为不同的用户以不同的方式投影字段),则可以通过三个步骤以编程方式创建dataframe。
从原始rdd创建行的rdd;
创建由structtype表示的模式,该structtype与在步骤1中创建的rdd中的行结构匹配。
通过sparksession提供的createdataframe方法将模式应用于行的rdd。
基本上,您必须为相应的类创建一个模式并将其应用于行。你可以在上面的链接中找到这个例子。
hth公司

相关问题