【问题标题】:Dynamically build case class or schema动态构建案例类或模式
【发布时间】:2019-06-03 22:12:32
【问题描述】:

给定一个字符串列表,有没有一种方法可以在不手动输入字符串的情况下创建案例类或架构。

例如,我有一个列表,

 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)

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

【问题讨论】:

  • 你可以只使用映射或循环来创建架构

标签: scala apache-spark


【解决方案1】:

假设列的数据类型相同:

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】:

    如果您拥有所有具有相同数据类型的字段,则可以简单地创建为

    val name_list=Seq("Bob", "Mike", "Tim")
    
    val fields = name_list.map(name => StructField(name, IntegerType, true))
    
    val schema = StructType(fields)
    

    如果您的数据类型与创建字段的 map 不同,则如上所述,键入并创建 schema

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 2012-06-26
        • 1970-01-01
        • 2020-11-28
        • 2017-02-25
        • 2017-04-25
        相关资源
        最近更新 更多