es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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 un pyspark.sql.DataFrame y usar la función dtypes() 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’.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay una forma directa de obtener el returnType de una udf sin llamarla en un DataFrame o almacenarla por separado en otro lugar. El returnType solo se define cuando la udf 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 la udf.

    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:

    dummy_df = spark.createDataFrame([(None,)], ["dummy"])
    dummy_schema = some_udf_function(dummy_df.dummy).schema
    return_type = dummy_schema.simpleString()
    

    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 el returnType de la udf. Sin embargo, este enfoque requiere que se almacene el returnType por separado al definir la udf:

    import pyspark.sql.functions as sf
    import pyspark.sql.types as st
    
    return_type = st.ArrayType(st.StringType())
    @sf.udf(returnType=return_type)
    def some_function(text: str) -> List[str]:
        return text.split(' ')
    
    expr = some_function(sf.col(input_column_name))
    dtype_abbreviation = return_type.simpleString() 
    expr_renamed = expr.alias(input_column_name + '_' + dtype_abbreviation)
    

    En este caso, return_type contiene el returnType de la udf, al que se puede acceder con el método simpleString() para obtener una representación de cadena del esquema. Este enfoque requiere más trabajo manual, pero le permite acceder al returnType sin tener que llamar a la udf en un DataFrame.

Comments are closed.