我的火花代码中有一个RDD[Person]
,我想将此rdd转换为dataframe
。 Person类不是案例类,它是常规的Scala类。我知道案例类,但无法从常规scala类转换。请帮助
答案 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.tupled
和Large.unapply
无法访问。这些方法在Large
上不存在。
如果这些限制对您来说至关重要,则可以使用workaround-以编程方式指定架构。
官方文件报价:
如果案例类无法提前定义(例如, 记录的结构编码为字符串,否则文本数据集为 解析的字段对不同用户的投影方式会有所不同), 可以通过三个步骤以编程方式创建DataFrame。
- 从原始RDD创建行的RDD;
- 在第1步中创建的RDD中,用StructType表示的模式与Rows的结构匹配。
- 通过SparkSession提供的createDataFrame方法将架构应用于行的RDD。
基本上,您必须为相应的类创建一个架构并将其应用于行。您可以在上面的链接中找到示例。
HTH