2017-03-19 12 views
-1

rddをDataFrameに変換すると、タイプミスマッチエラーが発生しましたが、実際にはタイプはケースクラスで定義されています。どのようにそれを修正するには?spark convertデータフレームエラー

var data = Array(Array("4/1/2014 1:01:00",40.7575,-73.9846,"B02512")) 
    var rdd = sc.makeRDD(data)  

    case class X(dt: java.sql.Timestamp, lat: Double, lon: Double, base: String) 
    var newDF = rdd.map { case Array(s0, s1, s2, s3) => X(s0, s1, s2, s3) }.toDF() 

エラー:

<console>:30: error: type mismatch; 
    found : Any 
    required: java.sql.Timestamp 
      var newDF = rdd.map { case Array(s0, s1, s2, s3) => X(s0, s1, s2, s3) }.toDF() 

<console>:30: error: type mismatch; 
    found : Any 
    required: Double 
      var newDF = rdd.map { case Array(s0, s1, s2, s3) => X(s0, s1, s2, s3) }.toDF() 

答えて

0

dataはとてもマップ操作がjava.sql.TimestampDoubleAnyの変換に失敗したタイプArray[Array[Any]]です。

強いタイプのオブジェクトを作成するには、dataArray[X]にしてください。

+0

この変更方法は?私はスカラーには新しいです。 – user595234

0

問題は、配列にさまざまなデータ型があるためです。最初の値は文字列、次に2つの数値と別の文字列です。したがって、1つのデータ型に一致させることができない場合は、デフォルトで「Any」と解釈されます。

これは一般的に、何かのように言うことによって、特定のデータ型を取るために

VARデータを強制することができます:配列[文字列]は新しいアレイ( "ABC"、 "123")

しかし、このwouldntのを=あなたの配列に異なるデータ型の値があるので、あなたのために働きます。それらをすべて文字列として渡してから、クラス内でtypecaseするか、1つのデータ型しか保持できない配列よりも洗練されたものを使用してください。