Modificando UDF en Spark para crear una columna adicional de clave
Tengo un dataframe que consiste en filas de datos y una columna de XML que necesita ser analizada. Soy capaz de analizar ese XML con el siguiente código de esta solución de stack overflow:
import xml.etree.ElementTree as ET
import pyspark.sql.functions as F
@F.udf('array<><id:string, age:string,="" sex:string="">>')
def parse_xml(s):
root = ET.fromstring(s)
return list(map(lambda x: x.attrib, root.findall('visitor')))
df2 = df.select(
F.explode(parse_xml('visitors')).alias('visitors')
).select('visitors.*')
df2.show()
Esta función crea un nuevo dataframe con los datos analizados del XML.
En cambio, ¿cómo puedo modificar esta función para incluir una columna del dataframe original de modo que pueda ser unida posteriormente?
Por ejemplo, si el dataframe original se ve así:
+----+---+----------------------+
|id |a |xml |
+----+---+----------------------+
|1234|. |<row1, row2=""> |
|2345|. |<row3, row4="">, <row5> |
|3456|. |<row6> |
+----+---+----------------------+
¿Cómo puedo incluir el ID en cada una de las filas del nuevo dataframe creado?</row3,></row1,></id:string,>
davy.ai
Para incluir la columna ID del dataframe original en el nuevo dataframe de datos XML analizados, puedes modificar la UDF
parse_xml
de la siguiente manera:Aquí, la UDF
parse_xml_with_id
toma dos argumentos:id
ys
. El argumentoid
representa la columna ID del dataframe original y se incluye en la estructura devuelta junto con los datos XML analizados. La UDF modificada devuelve una estructura con dos campos:id
yvisitor
. El campovisitor
es un arreglo de estructuras que representa los datos XML analizados.Para utilizar la UDF en la transformación del dataframe, puedes pasar tanto las columnas
id
comoxml
a la UDF de la siguiente manera:Aquí, primero seleccionamos las columnas
id
yxml
del dataframe original. Luego, pasamos estas columnas a la UDFparse_xml_with_id
para crear una nueva columna llamadaparsed_xml
, que es una estructura que contiene el ID y los datos XML analizados. Luego, explotamos la columnaparsed_xml
para crear un nuevo dataframe con las columnasid
,visitor_id
yvisitor_data
, dondevisitor_id
es el ID del dataframe original, yvisitor_data
es una estructura que representa los datos XML analizados. Finalmente, seleccionamos las columnas necesarias de este dataframe para crear la salida deseada.</id:string,>