¿Existe alguna manera de obtener el tipo de datos (dtype) de una pyspark.sql.column.Column sin llamar primero a una pyspark.sql.DataFrame?
Esto podría ser una pregunta de nicho, pero imagina que tienes una udf
definida de esta manera:
import pyspark.sql.functions as sf
import pyspark.sql.types as st
@sf.udf(returnType=st.ArrayType(st.StringType()))
def some_function(text: str) -> List[str]:
return text.split(' ')
Esto devuelve una udf
, de la cual necesito conocer su returnType
. ¿Hay alguna manera de obtener el tipo de retorno:
- Sin llamar a la
udf
en unpyspark.sql.DataFrame
y usar la funcióndtypes()
en el resultado - Sin almacenar el
returnType
de esta función en un lugar separado
Contexto:
Quiero dar un .alias
a la pyspark.sql.column.Column
que es devuelta por la udf
, pero el alias debería depender de su tipo.
Entonces, en código de ejemplo, el resultado deseado sería:
nombre_de_la_columna_de_entrada = 'columna_de_texto_alguno'
expr = some_udf_function(sf.col(nombre_de_la_columna_de_entrada))
dtype_abbreviation = get_dtype_return_type_abbreviation(expr)
expr_renamed = expr.alias(nombre_de_la_columna_de_entrada + '_' + dtype_abbreviation)
Donde el resultado deseado de get_dtype_return_type_abbreviation
sería, por ejemplo, ‘listadestrings’ para una udf
que devuelve st.ArrayType(st.StringType())
. En este caso, el alias sería ‘columnadetextolistade_listas’.
davy.ai
Desafortunadamente, no hay una forma directa de obtener el
returnType
de unaudf
sin llamarla en un DataFrame o almacenarla por separado en otro lugar. ElreturnType
solo se define cuando laudf
se llama en un DataFrame, momento en el que Spark infiere el esquema en función de los datos que pasan a través de laudf
.Una solución alternativa podría ser crear un DataFrame falso con una sola fila y columna, y luego llamar la
udf
en este DataFrame. Esto le permitiría recuperar el esquema sin realizar ningún cálculo real.Por ejemplo:
Esto le dará una representación de cadena del esquema, que luego podría analizar para extraer la información necesaria. Sin embargo, tenga en cuenta que este enfoque puede ser ineficiente para
udfs
grandes o complejas.Otra posibilidad es utilizar el atributo
udf.returnType
, que debería contener elreturnType
de laudf
. Sin embargo, este enfoque requiere que se almacene elreturnType
por separado al definir laudf
:En este caso,
return_type
contiene elreturnType
de laudf
, al que se puede acceder con el métodosimpleString()
para obtener una representación de cadena del esquema. Este enfoque requiere más trabajo manual, pero le permite acceder alreturnType
sin tener que llamar a laudf
en un DataFrame.