Как преобразовать все типы int dtypes в double одновременно в PySpark

#apache-spark #pyspark #double

Вопрос:

вот мой dataset

 DataFrame[column1: double, column2: double, column3: int, column4: int, column5: int, ... , column300: int]
 

Чего я хочу, так это

 DataFrame[column1: double, column2: double, column3: double, column4: double, column5: double, ... , column300: double]
 

Что я сделал
dataset.withColumn("column3", datalabel.column3.cast(DoubleType()))

Это слишком вручную, не могли бы вы показать мне, как это сделать?

Ответ №1:

Вы можете использовать понимание списка для построения списка преобразованных полей.

 import pyspark.sql.functions as F
...
cols = [F.col(field[0]).cast('double') if field[1] == 'int' else F.col(field[0]) for field in df.dtypes]
df = df.select(cols)
df.printSchema()
 

Ответ №2:

Сначала вам нужно отфильтровать int типы столбцов из доступной схемы.

Затем в сочетании с reduce вы можете выполнить итерацию DataFrame , чтобы привести их к вашему выбору

reduce это очень важная и полезная функциональность, которую можно использовать для навигации по любым итеративным вариантам использования в Spark в целом

Подготовка данных

 df = pd.DataFrame({
        'id':[f'id{i}' for i in range(0,10)],
        'col1': [i for i in range(80,90)],
        'col2': [i for i in range(5,15)],
        'col3': [6,7,5,3,4,2,9,12,4,10]
    
})


sparkDF = sql.createDataFrame(df)

sparkDF.printSchema()

root
 |-- id: string (nullable = true)
 |-- col1: long (nullable = true)
 |-- col2: long (nullable = true)
 |-- col3: long (nullable = true)

 

Идентификация

 sparkDF.dtypes

## [('id', 'string'), ('col1', 'bigint'), ('col2', 'bigint'), ('col3', 'bigint')]

long_double_list = [ col for col,dtyp in sparkDF.dtypes if dtyp == 'bigint' ]

long_double_list

## ['col1', 'col2', 'col3']
 

Уменьшить

 sparkDF = reduce(lambda df,c: df.withColumn(c,F.col(c).cast(DoubleType()))
                ,long_double_list
                ,sparkDF
            )

sparkDF.printSchema()

root
 |-- id: string (nullable = true)
 |-- col1: double (nullable = true)
 |-- col2: double (nullable = true)
 |-- col3: double (nullable = true)