2015-12-30 12 views
11

私は文字列に配列[文字列]を含む列を変換しようとしていますが、私は一貫してこのエラーsparkデータフレームのWrappedArrayカラムをStringに変換するにはどうすればよいですか?

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 78.0 failed 4 times, most recent failure: Lost task 0.3 in stage 78.0 (TID 1691, ip-******): java.lang.ClassCastException: scala.collection.mutable.WrappedArray$ofRef cannot be cast to [Ljava.lang.String; 

はここ

val mkString = udf((arrayCol:Array[String])=>arrayCol.mkString(",")) 
val dfWithString=df.select($"arrayCol").withColumn("arrayString", 
     mkString($"arrayCol")) 

答えて

22

WrappedArrayコードの一部がArrayないのget(普通の古いJavaのArrayはScalaコレクションではありません)。あなたはに署名を変更することができ、次のいずれか

import scala.collection.mutable.WrappedArray 

(arrayCol: WrappedArray[String]) => arrayCol.mkString(",") 

またはSeqのようなスーパータイプのいずれかを使用します。

(arrayCol: Seq[String]) => arrayCol.mkString(",") 

を最近のスパークのバージョンでは、あなたがconcat_wsを代わりに使用することができます:

import org.apache.spark.sql.functions.concat_ws 

df.select(concat_ws(",", $"arrayCol")) 
+5

私はWrappedArrayを使用しようとしたが、そのタイプの波平が認識:あなたのケースで

df.select("wifi_ids").rdd.map(row =>row.get(0).asInstanceOf[WrappedArray[WrappedArray[String]]].toSeq.map(x=>x.toSeq.apply(0))) 

は、私はそれがあると思います。 Seqはうまく動作します – bdguy

1

私のためのコードの作業:

val mkString = udf(arrayCol=>arrayCol.asInstanceOf[WrappedArray[String]].toArray.mkString(",")) 
val dfWithString=df.select($"arrayCol").withColumn("arrayString",mkString($"arrayCol")) 
+0

これは私のために働き、toArrayを追加しました。ありがとう – SparkleGoat

関連する問題