2016-10-14 10 views
6

私はScalaとSparkの両方に新しいので、うまくいけば誰かが私がどこに間違っているのか教えてください。Spark "CodeGenerator:Dataset.groupByKeyでコンパイルできませんでした"

私は3列のデータセット(id、name、year)を持っていますが、それぞれの名前について最新の年を探したいと思います。言い換えれば:

val latestYears = ds 
    .groupByKey(_.name) 
    .reduceGroups((left, right) => if (left.year > right.year) left else right) 
    .map(group => group._2) 

しかし、それは、このエラーを与え、生成されたJavaコードの多くを吐く:

BEFORE           AFTER 
| id_1 | name_1 | 2015 |      | id_2 | name_1 | 2016 | 
| id_2 | name_1 | 2016 |      | id_4 | name_2 | 2015 | 
| id_3 | name_1 | 2014 | 
| id_4 | name_2 | 2015 | 
| id_5 | name_2 | 2014 | 

私はgroupByKeyreduceGroupsが仕事を得るだろうと思った

ERROR CodeGenerator: failed to compile: 
org.codehaus.commons.compiler.CompileException: 
File 'generated.java', Line 21, Column 101: Unknown variable or type "value4" 

興味深いことに、名前と年の列だけのデータセットを作成すると、期待どおりに機能します。私は、これはスパークv2.0.1のバグかもしれ信じる:

object App { 

    case class Record(id: String, name: String, year: Int) 

    def main(args: Array[String]) { 
    val spark = SparkSession.builder().master("local").appName("test").getOrCreate() 
    import spark.implicits._ 

    val ds = spark.createDataset[String](Seq(
     "id_1,name_1,2015", 
     "id_2,name_1,2016", 
     "id_3,name_1,2014", 
     "id_4,name_2,2015", 
     "id_5,name_2,2014" 
    )) 
     .map(line => { 
     val fields = line.split(",") 
     new Record(fields(0), fields(1), fields(2).toInt) 
     }) 

    val latestYears = ds 
     .groupByKey(_.name) 
     .reduceGroups((left, right) => if (left.year > right.year) left else right) 
     .map(group => group._2) 

    latestYears.show() 
    } 


} 

EDIT:


は、ここで私が実行している完全なコードです。 v2.0.0にダウングレードした後、これは発生しなくなりました。

+0

ここで同じ問題が発生しましたが、reduceGroups()。map(_._ 2)をmapGroups(_。reduce(_._ 2))に変換して問題を解決しました。あなたはすでにこの問題をsparkメーリングリスト/ Issue Trackerに報告しましたか? –

+0

これはバグかもしれませんが、コードそのものにはさらに注意が払われています。なぜ 'year'に' groupBy'と 'max'を使わないのですか?それは、型指定されていないDataFrame API(Datasetではなく)を使用します。何か特別な理由? –

答えて

0

groupByreduceGroupsの機能はexperimentalです。なぜ使用しないでくださいreduceByKeyapi)?

長所:

  • あなたが持っているコードから変換が容易であるべきです。
  • より安定です(実験的ではありません)。
  • 各グループ内のすべての項目を完全にシャッフルする必要はないため(ネットワークI/Oの速度低下やノード内のメモリのオーバーフローも発生する可能性があるため)、より効率的でなければなりません。
関連する問題