【问题标题】:Error in creating dataframe: java.lang.RuntimeException: scala.Tuple2 is not a valid external type for schema of string创建数据框时出错:java.lang.RuntimeException:scala.Tuple2 不是字符串模式的有效外部类型
【发布时间】:2017-03-15 21:26:53
【问题描述】:

我已经使用以下代码创建了一个架构

val schema=  new StructType().add("city", StringType, true).add("female", IntegerType, true).add("male", IntegerType, true)

创建了一个RDD
val data = spark.sparkContext.textFile("cities.txt")

转换为 Row 的 RDD 以应用架构

    val cities = data.map(line => line.split(";")).map(row => Row.fromSeq(row.zip(schema.toSeq)))


 val citiesRDD = spark.sqlContext.createDataFrame(cities, schema)

这给了我一个错误

java.lang.RuntimeException: Error while encoding: java.lang.RuntimeException: scala.Tuple2 is not a valid external type for schema of string

【问题讨论】:

    标签: scala apache-spark dataframe apache-spark-sql


    【解决方案1】:

    创建Row 不需要架构,创建DataFrame 时需要架构。您还需要介绍一些如何将分割线(产生 3 个字符串)转换为整数的逻辑:

    这里是一个没有异常处理的最小解决方案:

    val data = sc.parallelize(Seq("Bern;10;12")) // mock for real data
    
    val schema = new StructType().add("city", StringType, true).add("female", IntegerType, true).add("male", IntegerType, true)
    
    val cities = data.map(line => {
    val Array(city,female,male) = line.split(";")
      Row(
        city,
        female.toInt,
        male.toInt
      )
     }
    )
    
    val citiesDF = sqlContext.createDataFrame(cities, schema)
    

    我通常使用案例类来创建数据框,因为 spark 可以从案例类中推断出架构:

    // "schema" for dataframe, define outside of main method
    case class MyRow(city:Option[String],female:Option[Int],male:Option[Int]) 
    
    val data = sc.parallelize(Seq("Bern;10;12")) // mock for real data
    
    import sqlContext.implicits._
    
    val citiesDF = data.map(line => {
    val Array(city,female,male) = line.split(";")
      MyRow(
        Some(city),
        Some(female.toInt),
        Some(male.toInt)
      )
    }
    ).toDF()
    

    【讨论】:

    • 感谢您的解决方案。如果列数超过 300 怎么办?最好的方法是什么?
    • @ShankarKoirala 对此不确定,我只知道 scala 存在某些限制,例如在 scala 2.11 之前,案例类被限制为 22 个字段(与元组相同)。第一种方法应该仍然有效,但也许值得考虑使用更复杂的列类型(结构、数组、映射)来减少列数...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2022-08-16
    • 2018-03-01
    • 2021-07-23
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多