Obtenção de dados usando a coluna de nomes armazenados como valores de uma coluna dentro do mesmo dataframe pyspark

0

Pergunta

Eu tenho um grande conjunto de dados semelhante ao exemplo abaixo :

ID CÓDIGO ESTUDO QUANTIDADE COL_NAME
111 5611 ABCD 56.17 ID
211 5411 GFED 451.1 QUANTIDADE
311 3212 YTRA 687.3 ESTUDO

Eu quero preencher os valores das colunas armazenadas em col_name em uma coluna(COL_VAL) dentro de um mesmo dataframe como abaixo :

ID CÓDIGO ESTUDO QUANTIDADE COL_NAME COL_VALUE
111 5611 ABCD 56.17 ID 111
211 5411 GFED 451.1 QUANTIDADE 451.1
311 3212 YTRA 687.3 ESTUDO YTRA

Eu estou usando um loop .recolher() para preencher valores, mas ele está tomando um monte de tempo. Gostaria de saber as formas mais eficientes de fazer o mesmo relevante para um grande conjunto de dados.

apache-spark loops pyspark python
2021-11-23 17:20:27
1

Melhor resposta

0

Você pode usar when para conseguir isso.

from pyspark.sql import functions as F

data = [(111, 5611, "ABCD", 56.17, "ID",),
(211, 5411, "GFED", 451.1, "AMOUNT",),
(311, 3212, "YTRA", 687.3, "STUDY",),]

df = spark.createDataFrame(data, ("ID", "CODE", "STUDY", "AMOUNT","COL_NAME"))

def derive_column_value():
    condition = F
    for possible_value in df.columns:
        condition = condition.when(F.col("COL_NAME") == possible_value, F.col(possible_value))
    return condition

df.withColumn("COL_VALUE", derive_column_value()).show()

Saída

+---+----+-----+------+--------+---------+
| ID|CODE|STUDY|AMOUNT|COL_NAME|COL_VALUE|
+---+----+-----+------+--------+---------+
|111|5611| ABCD| 56.17|      ID|      111|
|211|5411| GFED| 451.1|  AMOUNT|    451.1|
|311|3212| YTRA| 687.3|   STUDY|     YTRA|
+---+----+-----+------+--------+---------+
2021-11-23 17:41:06

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................