Учитывая набор данных, как вы видите в приведенном ниже коде (df
), я должен иметь возможность добавить производный столбец (DerivedCol
).Значение этого столбца является константой для группы idcol
строк и выводится путем применения а) предиката для значения другого столбца (filter
здесь), а затем б) функции агрегирования (max
используется здесь) по сопоставлениюgroup.
val df = Seq(("id1","k1","7"),("id2","k1","5"),("id1","k3","2"),("id3","k1","4"),("id2","k5","1"),("id4","k5","1"))
.toDF("idcol","keycol","valcol")
val aggDf = df.filter($"keycol" === "k1")
.select($"idcol",$"valcol")
.groupBy($"idcol")
.agg(max($"valcol".cast(IntegerType)).cast(StringType).as("DerivedCol"))
.withColumnRenamed("idcol", "newidcol")
df.join(aggDf, df("idcol") === aggDf("newidcol"), "left_outer")
.drop(aggDf("newidcol"))
Я использую left outer join
для этого.Мой набор данных очень большой (миллионы строк).У меня есть следующие вопросы:
- Есть ли другой подход для достижения этой цели?
- Какую логику разделения я должен использовать для уменьшения перемешивания?
Мощность столбца idcol
очень высока.Версия Spark 2.1.1.