Столбец категорий на основе отдельного значения в DataFrame Spark - PullRequest
1 голос
/ 09 июня 2019

В моих исходных данных у меня нет ни одного столбца категории, по которому я могу сгруппировать данные.

Итак, я хочу добавить новый пользовательский столбец категории в кадре данных Spark на основе другого столбца, скажем("QNAME") отличное значение.Который я хочу использовать в группе By для Pivot.

До сих пор я понятия не имею ... как это получить.

Допустим, у меня есть ниже исходный фрейм данных

   Qname    b   c   d
    SPT     1   10  555
    MTK     2   20  556
    NKP     3   30  557
    LKM     4   40  558
    SPT     5   50  559     
    MTK     7   70  561
    QRS     6   60  560
    NKP     7   70  561
    SPT     5   50  559
    LKM     7   70  561
    QRS     7   70  561
    MTK     7   70  561
    NKP     7   70  561

Итак, исходя из значений столбца ("QNAME"), я хочу, чтобы категории имели различную комбинацию значений.Например, значения ditinct (SPT, MTK, NKP, LKM, QRS) ... Так что для первого вхождения этого значения будет помечено как «aaa», затем второе вхождение будет помечено как «bbb» и т. Д.

Итак, ниже ожидаемый результат.

  Category         Qname    b   c   d
    "aaa"           SPT     1   10  555
    "aaa"           MTK     2   20  556
    "aaa"           NKP     3   30  557
    "aaa"           LKM     4   40  558
    "bbb"           SPT     5   50  559     
    "bbb"           MTK     7   70  561
    "aaa"           QRS     6   60  560
    "bbb"           NKP     7   70  561
    "ccc"           SPT     5   50  559
    "bbb"           LKM     7   70  561
    "bbb"           QRS     7   70  561
    "ccc"           MTK     7   70  561
    "ccc"           NKP     7   70  561

Я использую Scala и Spark для этого.Любая помощь или предложение приветствуется, чтобы взломать это.Заранее спасибо!

1 Ответ

0 голосов
/ 09 июня 2019

Задача может быть выполнена с помощью оконной функции "row_number ()".Если принять во внимание комментарий Джонатана Майерса, лучше использовать только цифры вместо символов:

val df = Seq(
  ("SPT", 1, 10, 555),
  ("MTK", 2, 20, 556),
  ("NKP", 3, 30, 557),
  ("LKM", 4, 40, 558),
  ("SPT", 5, 50, 559),
  ("MTK", 7, 70, 561),
  ("QRS", 6, 60, 560),
  ("NKP", 7, 70, 561),
  ("SPT", 5, 50, 559),
  ("LKM", 7, 70, 561),
  ("QRS", 7, 70, 561),
  ("MTK", 7, 70, 561),
  ("NKP", 7, 70, 561)
).toDF(
  "Qname", "b", "c", "d"
)

// action
val categoryWindow = Window.partitionBy($"Qname").orderBy("c")
val result = df.withColumn("Category", row_number().over(categoryWindow))

Результат:

+--------+-----+---+---+---+
|Category|Qname|b  |c  |d  |
+--------+-----+---+---+---+
|1       |SPT  |1  |10 |555|
|1       |NKP  |3  |30 |557|
|1       |QRS  |6  |60 |560|
|1       |LKM  |4  |40 |558|
|1       |MTK  |2  |20 |556|
|2       |NKP  |7  |70 |561|
|2       |LKM  |7  |70 |561|
|2       |QRS  |7  |70 |561|
|2       |SPT  |5  |50 |559|
|2       |MTK  |7  |70 |561|
|3       |NKP  |7  |70 |561|
|3       |MTK  |7  |70 |561|
|3       |SPT  |5  |50 |559|
+--------+-----+---+---+---+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...