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 |
私はgroupByKey
とreduceGroups
が仕事を得るだろうと思った
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にダウングレードした後、これは発生しなくなりました。
ここで同じ問題が発生しましたが、reduceGroups()。map(_._ 2)をmapGroups(_。reduce(_._ 2))に変換して問題を解決しました。あなたはすでにこの問題をsparkメーリングリスト/ Issue Trackerに報告しましたか? –
これはバグかもしれませんが、コードそのものにはさらに注意が払われています。なぜ 'year'に' groupBy'と 'max'を使わないのですか?それは、型指定されていないDataFrame API(Datasetではなく)を使用します。何か特別な理由? –