Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 从RDD[class]创建数据帧_Scala_Apache Spark_Dataframe_Rdd - Fatal编程技术网

Scala 从RDD[class]创建数据帧

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,

在我的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, 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类。