2017-05-31 1 views
1

spark.implicits._をインポートしていますが、ScalaプログラムのRDDからDataframeへの暗黙的な変換を実行できません。Spark Scalaプログラムのインプリシットが機能しない

ご協力いただければ幸いです。暗黙と

メインプログラム:以下のように

object spark1 { 

    def main(args: Array[String]) { 
    val spark = SparkSession.builder().appName("e1").config("o1", "sv").getOrCreate() 

    import spark.implicits._ 

    val conf = new SparkConf().setMaster("local").setAppName("My App") 
    val sc = spark.sparkContext 
    val data = sc.textFile("/TestDataB.txt") 
    val allSplit = data.map(line => line.split(",")) 
    case class CC1(LAT: Double, LONG: Double) 
    val allData = allSplit.map(p => CC1(p(0).trim.toDouble, p(1).trim.toDouble)) 
    val allDF = allData.toDF() 
    // ... other code 
    } 

} 

はエラーは次のとおりです。

Error:(40, 25) value toDF is not a member of org.apache.spark.rdd.RDD[CC1] val allDF = allData.toDF()

+0

メトロポリス、感謝をクリーンアップするために。マーク – user1154422

答えて

1

メインメソッドの中にケースクラスCC1を定義すると、https://issues.scala-lang.org/browse/SI-6649になります。 toDF()は、コンパイル時にそのクラスの適切な暗黙のTypeTagの位置を特定できません。あなたはこの単純な例では、これを見ることができます

case class Out() 

object TestImplicits { 

    def main(args: Array[String]) { 
    case class In() 
    val typeTagOut = implicitly[TypeTag[Out]] // compiles 
    val typeTagIn = implicitly[TypeTag[In]] // does not compile: Error:(23, 31) No TypeTag available for In 
    } 

} 

スパークの関連する暗黙的な変換は、このタイプのパラメータがあります。[T <: Product : TypeTag]newProductEncoderhereを参照)、暗黙のTypeTag[CC1]が必要とされることを意味します。

は、この問題を解決するには - 単に方法のうち、CC1の定義を移動したり、完全に対象外:

case class CC1(LAT: Double, LONG: Double) 

object spark1 { 

    def main(args: Array[String]) { 
    val spark = SparkSession.builder().appName("e1").config("o1", "sv").getOrCreate() 

    import spark.implicits._ 

    val data = spark.sparkContext.textFile("/TestDataB.txt") 
    val allSplit = data.map(line => line.split(",")) 

    val allData = allSplit.map(p => CC1(p(0).trim.toDouble, p(1).trim.toDouble)) 
    val allDF = allData.toDF() 
    // ... other code 
    } 

} 
+0

注:私の答えを編集しました(最初のバージョンは正しい修正がありましたが、間違った説明があります) –

+0

Tzach、意味があります。助けてくれてありがとう、Marc – user1154422

+1

@TzachZohar、@ user1154422、 'CC1'" _classを(実行時、コンパイル時ではなく)_動的に作成することについてのアイデアは、明らかに** _ wrong _ **です。あなたは、悪いコード行をコメントアウトし、コンパイルされた '.class'ファイルを調べることによってそれを検証することができます。また、 'CC1'クラスを外側のコンテキストに移動する必要はありません。ローカルコンパイルコンテキストの外側、つまり' spark1'オブジェクトの中に直接移動するだけで十分です。これは[SI-6649](https://issues.scala-lang.org/browse/SI-6649)に関連しているようですが、同様の動作が意図的であると説明されています(理由はわかりませんが)。 – SergGr

0

私はtoDFsqlContext.implicits._にあなたがいないspark.implicits._ことをインポートする必要があると思いました。少なくともそれがスパークの場合1.6

関連する問題