как повернуть / перенести строки столбца в отдельные столбцы в spark-scala без использования метода pivot

#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 за ваш ответ, не могли бы вы пояснить, как использовать первый метод в приведенном выше коде, что именно он делает?