2017-07-16 12 views
0

私は以下の簡単なプログラムを持っていますが、Scalaの配列内で値を読み取る方法はわかりません。ScalaのWrappedArrayからデータを取得

val all_marks = Result.groupBy("class", "school").agg(collect_list("mark") as "marks",count("*") as "cnt").where($"cnt" > 10) 

var mrk=all_marks.collect().map(mark=>""+mark(2)) 

結果は次のように見える:

mrk: Array[String] = Array(WrappedArray(52.0, 18.0, 17.0, 36.0, 22.0, 22.0), WrappedArray(49.0, 53.0, 41.0, 30.0, 48.0, 36.0)) 

Iがそれぞれ各WrappedArrayにおける各マークに関するさらなる数学的な計算のために、別々WrappedArrayを読み取る(MRK)の配列を反復する必要があります。簡単な方法で各WrappedArrayを読み込む方法。

+0

あなたは 'mrk.foreach'を使用してみましたを定義しますか?また、 '.map(mark => mark(2).toString)'も参照してください。 – philantrovert

+0

私は(e < - mrk){val d = e.toDouble}を試しました。しかし、 "java.lang.NumberFormatExceptionのエラーが発生しました:入力文字列:" WrappedArray " –

+0

はい私は(mark => mark(2).toString).mapを試しましたが、このメソッドはマークをdoubleに変更しません –

答えて

0

あなたはその後、(リスト)RDDするデータフレームを変換し、その後

val mrk=all.select("marks") 

と((2)マーク=> "" +マーク)のvar MRK = all_marks.collect()。マップを交換する必要がある、とバックデータフレーム

toRDD=mrk.rdd.map(_.getList[Int](0).toList).toDF("marks") 

に続いUDF

var i=0 
    var read_row_by_row="" 
//define udf 
    val createUdf = udf((list: Seq[Int]) => { 
     val ascending = list.sorted //sorts in ascending order 
//in this loop you can add whatever you like of calculations  
for (i <- 0 to ascending.size - 1){ 
     read_row_by_row=read_row_by_row+","+ascending(i) 
     } 

     s"${read_row_by_row}" 
    }) 
    val g =ag_two.withColumn("mark", createUdf($"marks")) 
    g.show 
+--------------------+ 
|    marks| 
+--------------------+ 
|,17,17,17,17,18,1...| 
|,18,18,18,18,19,1...| 
|,18,23,24,24,24,2...| 
|,18,23,24,24,24,2...| 
|,17,18,18,18,18,1...| 
|,25,35,36,39,41,4...| 
|,25,35,36,39,41,4...| 
|,31,31,33,33,33,3...| 
関連する問題