动态构建案例类或模式

时间:2018-05-02 15:33:26

标签: scala apache-spark

给定一个字符串列表,有没有办法在不手动输入srings的情况下创建案例类或Schema。

对于eaxample,我有一个List,

 val name_list=Seq("Bob", "Mike", "Tim")

列表并不总是一样的。有时它会包含不同的名称,并且大小会有所不同。

我可以创建一个案例类

case class names(Bob:Integer, Mike:Integer, Time:Integer)

或架构

 val schema = StructType(StructFiel("Bob", IntegerType,true)::
            StructFiel("Mike", IntegerType,true)::
            StructFiel("Tim", IntegerType,true)::Nil)

但我必须手动完成。我正在寻找一种动态执行此操作的方法。

3 个答案:

答案 0 :(得分:0)

如果所有字段的数据类型都相同,则只需创建为

即可
val name_list=Seq("Bob", "Mike", "Tim")

val fields = name_list.map(name => StructField(name, IntegerType, true))

val schema = StructType(fields)

如果您使用的数据类型与创建map字段的数据类型不同,请输入并按上述方式创建schema

希望这有帮助!

答案 1 :(得分:0)

假设列的数据类型相同:

import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._

val nameList=Seq("Bob", "Mike", "Tim")

val schema = StructType(nameList.map(n => StructField(n, IntegerType, true)))
// schema: org.apache.spark.sql.types.StructType = StructType(
//   StructField(Bob,IntegerType,true), StructField(Mike,IntegerType,true), StructField(Tim,IntegerType,true)
// )

spark.createDataFrame(rdd, schema)

如果数据类型不同,您也必须提供它们(在这种情况下,与手动组装模式相比,它可能不会节省太多时间):

val typeList = Array[DataType](StringType, IntegerType, DoubleType)
val colSpec = nameList zip typeList

val schema = StructType(colSpec.map(cs => StructField(cs._1, cs._2, true)))
// schema: org.apache.spark.sql.types.StructType = StructType(
//   StructField(Bob,StringType,true), StructField(Mike,IntegerType,true), StructField(Tim,DoubleType,true)
// )

答案 2 :(得分:0)

以上所有答案仅涵盖创建架构的一个方面。您可以使用以下解决方案从生成的架构创建案例类: https://gist.github.com/yoyama/ce83f688717719fc8ca145c3b3ff43fd