给定一个字符串列表,有没有办法在不手动输入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)
但我必须手动完成。我正在寻找一种动态执行此操作的方法。
答案 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