Arrays Scala将WrappedArray或数组[Any]转换为数组[String]

Arrays Scala将WrappedArray或数组[Any]转换为数组[String],arrays,scala,Arrays,Scala,我一直在尝试将RDD转换为数据帧。为此,需要定义类型,而不是任何类型。我使用的是spark MLLib PrefixSpan,这就是freqSequence.sequence的来源。我从一个数据框开始,该数据框包含会话ID、视图和购买,作为字符串数组: viewsPurchasesGrouped: org.apache.spark.sql.DataFrame = [session_id: decimal(29,0), view_product_ids: array[string], purc

我一直在尝试将RDD转换为数据帧。为此,需要定义类型,而不是任何类型。我使用的是spark MLLib PrefixSpan,这就是freqSequence.sequence的来源。我从一个数据框开始,该数据框包含会话ID、视图和购买,作为字符串数组:

viewsPurchasesGrouped: org.apache.spark.sql.DataFrame =
  [session_id: decimal(29,0), view_product_ids: array[string], purchase_product_ids: array[string]]
然后,我计算频繁模式,并将它们放在数据帧中,以便将它们写入配置单元表

val viewsPurchasesRddString = viewsPurchasesGrouped.map( row => Array(Array(row(1)), Array(row(2)) ))

val prefixSpan = new PrefixSpan()
  .setMinSupport(0.001)
  .setMaxPatternLength(2)

val model = prefixSpan.run(viewsPurchasesRddString)

val freqSequencesRdd = sc.parallelize(model.freqSequences.collect())

case class FreqSequences(views: Array[String], purchases: Array[String], support: Long)

val viewsPurchasesDf = freqSequencesRdd.map( fs =>
  {   
  val views = fs.sequence(0)(0)
  val purchases = fs.sequence(1)(0)
  val freq = fs.freq
  FreqSequences(views, purchases, freq)
  }
)
viewsPurchasesDf.toDF() // optional
当我试着运行它时,视图和购买是“Any”而不是“Array[String]”。我拼命地想把它们转换过来,但我得到的最好的是数组(Any)。我想我需要将内容映射到一个字符串,我已经试过了,例如,this:和this:以及数千个其他Stackoverflow问题


我真的不知道怎么解决这个问题。我想我已经将初始数据帧/RDD转换为很多,但不知道在哪里。

我认为问题在于您有一个
数据帧,它不保留静态类型信息。当您从
中取出一个项目时,您必须明确地告诉它您希望得到的类型

未经测试,但根据您提供的信息推断:

import scala.collection.mutable.WrappedArray

val viewsPurchasesRddString = viewsPurchasesGrouped.map( row =>
  Array(
    Array(row.getAs[WrappedArray[String]](1).toArray), 
    Array(row.getAs[WrappedArray[String]](2).toArray)
  )
)

我解决了这个问题。作为参考,本工程:

val viewsPurchasesRddString = viewsPurchasesGrouped.map( row =>
  Array(
  row.getSeq[Long](1).toArray, 
  row.getSeq[Long](2).toArray
  )
)

val prefixSpan = new PrefixSpan()
  .setMinSupport(0.001)
  .setMaxPatternLength(2)

val model = prefixSpan.run(viewsPurchasesRddString)

case class FreqSequences(views: Long, purchases: Long, frequence: Long)

val ps_frequences = model.freqSequences.filter(fs => fs.sequence.length > 1).map( fs =>
    {   
    val views = fs.sequence(0)(0)
    val purchases = fs.sequence(1)(0)
    val freq = fs.freq
    FreqSequences(views, purchases, freq)
    }
)

ps_frequences.toDF()

谢谢你的回答!尝试此操作时,我收到以下错误消息:
viewsPurchasesRddString:org.apache.spark.rdd.rdd[Array[Array[String]]]]=MapPartitionsRDD[1801]在地图上:197 prefixSpan:org.apache.spark.mllib.fpm.prefixSpan=org.apache.spark.mllib.fpm。PrefixSpan@13b756c2org.apache.spark.sparkeexception:作业因阶段失败而中止:阶段1272.0中的任务28失败4次,最近的失败:阶段1272.0中的任务28.3丢失(…):java.lang.ClassCastException:scala.collection.mutable.WrappedArray$ofRef无法强制转换为[Ljava.lang.String;
,不幸的是,即使在导入时,我也会遇到相同的错误。