Scala 将文本文件动态转换为数据帧

Scala 将文本文件动态转换为数据帧,scala,apache-spark,apache-spark-sql,spark-dataframe,Scala,Apache Spark,Apache Spark Sql,Spark Dataframe,我试图使用在运行时读取的模式文件将输入从文本文件转换为数据帧。 我的输入文本文件如下所示: John,23 Charles,34 name:string age:integer 架构文件如下所示: John,23 Charles,34 name:string age:integer 这就是我所尝试的: object DynamicSchema { def main(args: Array[String]) { val inputFile = args(0) val s

我试图使用在运行时读取的模式文件将输入从文本文件转换为数据帧。 我的输入文本文件如下所示:

John,23
Charles,34
name:string
age:integer
架构文件如下所示:

John,23
Charles,34
name:string
age:integer
这就是我所尝试的:

object DynamicSchema {
  def main(args: Array[String]) {
    val inputFile = args(0)
    val schemaFile = args(1)
    val schemaLines = Source.fromFile(schemaFile, "UTF-8").getLines().map(_.split(":")).map(l => l(0) -> l(1)).toMap
    val spark = SparkSession.builder()
      .master("local[*]")
      .appName("Dynamic Schema")
      .getOrCreate()
    import spark.implicits._
    val input = spark.sparkContext.textFile(args(0))
    val schema = spark.sparkContext.broadcast(schemaLines)
    val nameToType = {
      Seq(IntegerType,StringType)
        .map(t => t.typeName -> t).toMap
    }
    println(nameToType)
    val fields = schema.value
      .map(field => StructField(field._1, nameToType(field._2), nullable = true)).toSeq
    val schemaStruct = StructType(fields)
    val rowRDD = input
      .map(_.split(","))
      .map(attributes => Row.fromSeq(attributes))
    val peopleDF = spark.createDataFrame(rowRDD, schemaStruct)
    peopleDF.printSchema()

    // Creates a temporary view using the DataFrame
    peopleDF.createOrReplaceTempView("people")

    // SQL can be run over a temporary view created using DataFrames
    val results = spark.sql("SELECT name FROM people")
    results.show()
  }
}
尽管printSchema给出了所需的结果,但result.show会显示错误。我认为年龄字段实际上需要使用toInt进行转换。当模式仅在运行时可用时,是否有方法实现相同的功能?

Replace

val input = spark.sparkContext.textFile(args(0))


并将其移动到架构定义之后。

请发布错误日志。谢谢!!工作很有魅力。只是一个相关的问题。我构建StructFields和StructType的方法正确吗?还是有更好或更优雅的解决方案?
广播
没有意义。其余的看起来是合理的。