Scala 从RDD[class]创建数据帧
在我的spark代码中有一个Scala 从RDD[class]创建数据帧,scala,apache-spark,dataframe,rdd,Scala,Apache Spark,Dataframe,Rdd,在我的spark代码中有一个RDD[Person],我想把这个RDD转换成dataframe。Person类不是case类,它是一个常规的Scala类。我知道case类,但我无法从常规scala类转换。请帮助Scala 2.11修复了case类中22个字段的限制。可以创建包含22个以上字段的案例类: // 23 letters of the English alphabet scala> case class Large( | a: Int, b: Int, c: Int,
RDD[Person]
,我想把这个RDD转换成dataframe
。Person类不是case类,它是一个常规的Scala类。我知道case类,但我无法从常规scala类转换。请帮助Scala 2.11修复了case类中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.tuple
和Large.unapply
不可访问。那些方法在Large
上不存在
如果这些限制对您来说至关重要,那么可以通过编程方式指定模式
引用官方文件:
如果无法提前定义案例类(例如
将记录的结构编码为字符串,或者将创建文本数据集
对于不同的用户,解析字段和字段的投影方式不同),
数据帧可以通过三个步骤以编程方式创建
- 从原始RDD创建行的RDD李>
- 创建由StructType表示的模式,该StructType与在步骤1中创建的RDD中的行结构相匹配
- 通过SparkSession提供的createDataFrame方法将模式应用于行的RDD
HTH如果您可以将此类设置为案例类,这将是最佳解决方案。如果不能(可能是一个外部Java类),可以使用Kryo序列化为任何类创建一个
编码器
。但是,请记住,它可能很慢。@LuisMiguelMejíaSuárez在我的person类中,有56个字段,所以我不能将其作为case类。