【问题标题】:Type mismatch error. found Array[String] requires Seq[?] in Scala Spark类型不匹配错误。在 Scala Spark 中发现 Array[String] 需要 Seq[?]
【发布时间】:2020-04-23 20:11:40
【问题描述】:

以下是我看到的代码和构建错误。 你能告诉我如何解决这个错误。 这是完整的代码。 URL 被省略。 使用的 Spark 版本是 1.6.0 使用的 Scala 版本是 2.10.5

代码

import java.net.{HttpURLConnection, URL}
import org.slf4j.LoggerFactory
import org.apache.spark.sql.{DataFrame, Row, SQLContext}
import org.apache.spark.sql.hive.HiveContext
import org.apache.spark.{SparkConf, SparkContext}
import java.util.Arrays
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.sql.expressions._
import org.apache.spark.sql.Row
import org.apache.spark.sql.types.StructType._
import scala.Predef.exceptionWrapper

对象 CoExtract {

    private val logger = LoggerFactory.getLogger(getClass)
    def main(args: Array[String]) {

    val sparkConf = new SparkConf()
    val sc = new SparkContext(sparkConf)
    val sqlcontext = new SQLContext(sc)
//  val sqlcontext = new HiveContext(sc)

    import sqlcontext.implicits._

    val obj = new Connection
    val string_response=obj.getCsvResponse(obj.getConnection(new URL("https://")))

    val array_response = string_response.split("\n")
    logger.info("The length of the array is "+ array_response.length)
    val rdd_response=sc.parallelize(array_response.toSeq)

    logger.info("The count of elements in the rdd are "+rdd_response.count())

val header = rdd_response.first()
logger.info("header"+header)

val noheaderRDD = rdd_response.filter(_ != header)
logger.info("NoheaderRDD is"+noheaderRDD.first())

val subsetRdd=noheaderRDD.map( x => (Row(
  x.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)",-1)(0),
  x.split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)",-1)(1),
  x.split(",")(2)

)
  )
)

val x =subsetRdd.zipWithIndex().collect()

val schema = new StructType()
  .add(StructField("Email",StringType, true))
  .add(StructField("Recipient",StringType, true))
  .add(StructField("rowid", LongType, false))


val rdd_to_df = sqlcontext.createDataFrame(subsetRdd,schema)
val df_to_rdd_again = rdd_to_df.rdd.zipWithIndex

rdd_to_df.withColumn("rowid", row_number.over(Window.partitionBy(lit(1)).orderBy(lit(1))))
val final_df = sqlcontext.createDataFrame(df_to_rdd_again.map{case (row,index) => Row.fromSeq(row.toSeq ++ Seq(index))}, schema )

val start: Int = 0
val end: Int = rdd_to_df.count().toInt
var counter:Int = start



 logger.info("Final Count" + end)
    logger.info("The schema of the dataframe is "+rdd_to_df.printSchema())
final_df.show(100,false)

logger.info("Schema of rdd to df" + rdd_to_df.printSchema())
logger.info("schema of final_df" + final_df.printSchema())

val df_response = sqlcontext.read.format("com.databricks.spark.csv").option("header", "true").load("hdfs:///")

logger.info("dataframe的schema是"+df_response) logger.info("数据帧的计数为"+df_response.count())

} }

构建错误

scala:48: error: type mismatch;
[ERROR]  found   : Array[String]
[ERROR]  required: Seq[?]
[ERROR] Error occurred in an application involving default arguments.
[INFO]     val rdd_response=sc.parallelize(array_response)
[INFO]                                     ^

【问题讨论】:

  • 所有信息都在 ypur 错误控制台中提供:string_response.split("\n") 返回一个数组,但并行化需要 Seq,因此您只需将 array_response 转换为 seq,同时将其传递给并行化功能
  • scala:48: error: value toSeq is not a member of Array[String]
  • 显示代码,因为它是会员
  • 我用下面的代码替换了它val rdd_response=sc.parallelize(array_response.toSeq)
  • 能否添加完整的代码进行测试?

标签: scala dataframe intellij-idea apache-spark-sql rdd


【解决方案1】:

只需将Array 转换为Seq

val rdd_response=sc.parallelize(array_response.toSeq)

【讨论】:

  • scala:48: error: value toSeq is not a member of Array[String]
  • 你用的是什么版本?
  • Scala 版本 1.6.0
  • 那是 Spark 版本。 Scala 版本将是 2.XX
  • 对不起,我的错。 Spark 版本是 1.6.0 Scala 版本是 2.10.5
猜你喜欢
  • 2018-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多