#scala #apache-spark #apache-spark-sql
#scala #apache-spark #apache-spark-sql
Вопрос:
Комментарии:
1. Пожалуйста, нажмите на ссылку для ссылки на мой вариант использования. Спасибо
Ответ №1:
Вы можете получить тот же результат без использования pivot, добавив столбцы вручную, если вы знаете все имена новых столбцов:
import org.apache.spark.sql.functions.{col, when}
dataframe
.withColumn("cheque", when(col("ttype") === "cheque", col("tamt")))
.withColumn("draft", when(col("ttype") === "draft", col("tamt")))
.drop("tamt", "ttype")
Поскольку это решение не запускает перемешивание, ваша обработка будет быстрее, чем при использовании pivot.
Это можно обобщить, если вы не знаете названия столбцов. Однако в этом случае вам следует провести сравнительный анализ, чтобы проверить, является ли pivot более производительным:
import org.apache.spark.sql.functions.{col, when}
val newColumnNames = dataframe.select("ttype").distinct.collect().map(_.getString(0))
newColumnNames
.foldLeft(dataframe)((df, columnName) => {
df.withColumn(columnName, when(col("ttype") === columnName, col("tamt")))
})
.drop("tamt", "ttype")
Комментарии:
1. Большое спасибо, Винсент, очень красиво сформулировано, и оно работает как шарм.
Ответ №2:
Используйте groupBy
, pivot
amp; agg
функции. Проверьте приведенный ниже код. Добавлены встроенные комментарии.
scala> df.show(false)
---------- ------ ----
|tdate |ttype |tamt|
---------- ------ ----
|2020-10-15|draft |5000|
|2020-10-18|cheque|7000|
---------- ------ ----
scala> df
.groupBy($"tdate") // Grouping data based on tdate column.
.pivot("ttype",Seq("cheque","draft")) // pivot based on ttype and "draft","cheque" are new column name
.agg(first("tamt")) // aggregation by "tamt" column.
.show(false)
---------- ------ -----
|tdate |cheque|draft|
---------- ------ -----
|2020-10-18|7000 |null |
|2020-10-15|null |5000 |
---------- ------ -----
Комментарии:
1. Спасибо Srinivas за ваш ответ, не могли бы вы пояснить, как использовать первый метод в приведенном выше коде, что именно он делает?