2016-10-03 6 views
1

Scalaでは、いくつかのものにRDDコラム:スプリット私はこのフォームのRDDを持って

org.apache.spark.rdd.RDD[(String, Int, Array[String])] 

これは、RDDの最初の要素である:

(001, 5, Array(a, b, c)) 

そして私はそのリストを分割したいですいくつかの列では、コンマで区切られているので、期待される出力は次のようになります。

(001, 5, a, b, c) 

助けが必要ですか?

SOLUTION:

私は最終的に問題を解決: 私がやったことで、文字列全体に配列を構成した後、 mkstring(「」) とは、データフレームにRDDを変換します。これで、カラムの文字列をwithColumnsメソッドで分割することができました

+2

'yourRDD.map {case(i、n、List(a、b、c))=>(i、n、a、b、c))'おそらく、要素として何を意味するのかはっきりしません「分離されたコンマ」ではなく、印刷されたものです。 –

答えて

0

リストから値を1つずつ取得してタプルに入れるだけで済むと思います。あなたはこのような何か、一般的には

RDD[(String, Int, List[String])] 

を持っている場合は、列としてそのリストの要素とRDDを生成しようとするべきではありません。この

val result = RDD.map(x => (x._1, x._2, x._3(0), x._3(1), x._3(2))) 
+0

はい、それは方法ですが、リストに多数の要素がある場合はどうなりますか?それらを繰り返し処理して戻す方法はありますか? – Thabby07

+0

は、リスト内の要素数が固定されていますか? @ Thabby07 – Frankie

+0

はい、リストには298項目あります。 – Thabby07

0

を試してみてください。

Scalaが厳密に型指定された言語であり、RDD[T]がのRDDである必要があるという理由があります。

今、最初の行はRDD[(String, Int, String, String, String)]が、必要になること...今、あなたが見ることができるよう、あなたのRDDだけ異なる長さのリストを2、「行」(要素)を以下のいた

("001", 5, List("a", "b", "c")) 
("002", 5, List("a", "b", "c", "d")) 

を言うことができます秒はRDD[(String, Int, String, String, String, String)]が必要です。

これにより、生成されたRDDのタイプがAnyと考えられ、RDD[Any]になります。そして、このAnyタイプは実行時にErasureのためにあなたのことをさらに制限します。

しかし、あなたは問題なくこれを行うことができ、特殊なケースがある - あなたは、各リストは、(この場合は3を言うことができます)known and same長さを持っていることを知っていれば、

val yourRdd = rdd.map({ 
    case (s, i, s1 :: s2 :: s3 :: _) => (s, i, s1, s2, s3) 
}) 

今...それがある場合この特別なケースではなく、あなたのリストは異なる未知のサイズを持つことができます...もしあなたがそれをしたいのであれば...不特定の長さのリストをタプルに変換するのは簡単なことではありません。少なくとも、私はそれを行う簡単な方法は考えられません。

そして、私は非常に確かな理由なしにこれをやろうとしないようにアドバイスします。

関連する問題