2017-02-03 13 views
0

私のようなスキーマに何か持っている -Spark 2のデータフレームでNone値を受け入れる方法を教えてください。

val schema = StructType(Seq (
StructField("a", StringType, true), 
StructField("b", StringType, true), 
StructField("c", StringType, true) 
)) 

and making a dataframe like - 

import scala.collection.JavaConverters._ 

val listrow: List[Row] = List(Row("E-001", "P-001", None), Row("E-001", "P-001", "Attending")) 
val rdd = sqlContext.sparkContext.parallelize(listrow) 
val df = sqlContext.createDataFrame(rdd, scm) 

は今、私はdf.first()を行うときに、私はエラーを取得し、の本質がある - java.lang.RuntimeException:エラーをエンコードする際に: java.lang.RuntimeException:scala.None $は文字列のスキーマに有効な外部型ではありません

このようにdfを作成する必要があることに注意してください。上記は単なる例ですが、プロダクションのコードは少し複雑です。私はそれがSpark 1.6で動作していたと思いますが、Spark 2.0.1では失敗し始めました。これはエンコーダーと関係がありますか?一部のデータは常にNoneを持ち、dfはそれを処理する必要があることに注意してください。これを処理する方法はありますか、データにはNoneがありませんか?

誰もがこれを見て、おそらく解決策が分かっているのですか?

ありがとうございます!

+1

あなたの列には文字列が必要ですが、 'None'は文字列ではありません。 Noneを文字列に変換するか、 'String'の代わりに' Option [String] 'を受け入れ、' Option [String] 'に文字列を変換するように列を変更してください。本当に、私はそれらの 'None'sを最初に生成しているコードを修正したいと思っています。それは大きな設計上の欠陥のようです。 – puhlen

+0

私は同意します。しかし、これに対応するためにスキーマで行うことができるものはありますか? –

+0

データフレーム内のデータはどのように見えますか?文字通り、異なるタイプ(オプションと文字列)が同じ列にあるか、両方のタイプを挿入して、それらを1つのタイプに自動的にホモジナイズできるようにしたいですか? – puhlen

答えて

4

あなたはnull.asInstanceOf [文字列]で[なし]を置き換えることはできません。

val listrow: List[Row] = List(Row("E-001", "P-001", null.asInstanceOf[String]), Row("E-001", "P-001", "Attending")) 

scala> df.show 
+-----+-----+---------+ 
| a| b|  c| 
+-----+-----+---------+ 
|E-001|P-001|  null| 
|E-001|P-001|Attending| 
+-----+-----+---------+ 

以前に述べたものと一緒に行くと、その第三値のオプションを使用するケースクラス[文字列]を使用します。

case class Foo(a: String, b:String, c:Option[String]) 

val listFoo: List[Foo] = List(Foo("E-001", "P-001", None), Foo("E-001", "P-001", Some("Attending"))) 
listFoo.toDF.show 
+-----+-----+---------+ 
| a| b|  c| 
+-----+-----+---------+ 
|E-001|P-001|  null| 
|E-001|P-001|Attending| 
+-----+-----+---------+ 
+0

ご返信いただきありがとうございますが、私が述べたように、私が尋ねていることが可能であれば、そのようなデータ変更に対応するためにスキーマを使って何かをしようとしています。 –

+1

データフレームにデータを入力する前にデータを変更する方がはるかに好ましい方法です。オプションと文字列を同じ列に入れたい場合は、StringTypeではなくAny型を使用できます。 – puhlen

+0

Any型のAny型がありますか? –

関連する問題