Eu tenho um dataframe abaixo
dataDictionary = [('value1', [{'key': 'Fruit', 'value': 'Apple'}, {'key': 'Colour', 'value': 'White'}]),
('value2', [{'key': 'Fruit', 'value': 'Mango'}, {'key': 'Bird', 'value': 'Eagle'}, {'key': 'Colour', 'value': 'Black'}]),
('value3', [{'key': 'Fruit', 'value': 'Apple'}, {'key': 'colour', 'value': 'Blue'}])]
df = spark.createDataFrame(data=dataDictionary)
df.printSchema()
df.show(truncate=False)
+------+------------------------------------------------------------------------------------------------+
|_1 |_2 |
+------+------------------------------------------------------------------------------------------------+
|value1|[{value -> Apple, key -> Fruit}, {value -> White, key -> Colour}] |
|value2|[{value -> Mango, key -> Fruit}, {value -> Eagle, key -> Bird}, {value -> Black, key -> Colour}]|
|value3|[{value -> Apple, key -> Fruit}, {value -> Blue, key -> colour}]
+------+------------------------------------------------------------------------------------------------+
Eu queria extrair apenas os valores de key -> Colour e estou usando abaixo para obter o resultado exato
from pyspark.sql import SparkSession, functions as F
...
df = df.select('_1', F.filter('_2', lambda x: x['key'] == 'Colour')[0]['value'])
resultado,
_1 _2
value1 White
value2 Black
value3
Mas para valor3, não há resultado porque a chave está em minúsculas colour
, enquanto para valor1 e valor2, a chave está em camel case, Colour
o que funciona com a função lambda F.filter('_2', lambda x: x['key'] == 'Colour')[0]['value']
. Tentei usar upper para lidar com os três cenários, mas não funcionou.
F.filter('_2', lambda x: x['key'].upper() == 'COLOUR')[0]['value']
Qualquer sugestão será apreciada.