有一个 RDD[Person] 我想把这个rdd转换成 dataframe . person类不是case类,而是常规的scala类。我知道case类,但我无法从常规scala类转换。请帮忙
RDD[Person]
dataframe
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公司
Large.tupled
Large.unapply
Large
1条答案
按热度按时间yduiuuwa1#
case类中22个字段的限制在scala2.11中被修复。可以创建一个包含22个以上字段的case类:
它可以与常用的sparkDataframeapi配合使用:
但是对于包含22+个字段的case类有两个限制:
Large.tupled
以及Large.unapply
无法访问。这些方法在计算机上不存在Large
.如果这些限制对您来说是至关重要的,那么有一个解决方法—通过编程指定模式。
引用官方文件:
如果不能提前定义case类(例如,将记录的结构编码为字符串,或者对文本数据集进行解析,并为不同的用户以不同的方式投影字段),则可以通过三个步骤以编程方式创建dataframe。
从原始rdd创建行的rdd;
创建由structtype表示的模式,该structtype与在步骤1中创建的rdd中的行结构匹配。
通过sparksession提供的createdataframe方法将模式应用于行的rdd。
基本上,您必须为相应的类创建一个模式并将其应用于行。你可以在上面的链接中找到这个例子。
hth公司