PySpark与for循环

时间:2018-11-30 18:19:07

标签: python python-3.x pyspark

我需要遍历PySpark中的数据帧16次。

没有PySpark,任务运行很快,但是使用PySpark运行函数get_unidades_parecidas时,消息错误作为返回:

WARN  TaskSetManager:66 - Stage 1341 contains a task of very large size (1000 KB). The maximum recommended task size is 100 KB.`

我认为错误是因为在第8行的get_unidades_mesma_rua函数中for循环的声明。

df的架构:

StructType(List(StructField(code,LongType,true),StructField(tipo,StringType,true),StructField(sale_value,LongType,true),StructField(address_district,StringType,true),StructField(address_number,StringType,true),StructField(areaPrivate,LongType,true),StructField(address_place,StringType,true),StructField(bedrooms,LongType,true),StructField(parkingSpaces,LongType,true),StructField(sale_per_area,DoubleType,true)))

目标是df的行

def get_unidades_parecidas(df, target):        
    backup_maior_amostra = SQLcontext.createDataFrame(sc.emptyRDD(), StructType([]))
    lista_de_possilidades_quarto_vaga = get_lista_possiblidades_quarto_vaga(target.bedrooms, target.parkingSpaces)

    for possibilidade in lista_de_possilidades_quarto_vaga:
        controle_de_area = 0.1
        quarto_minimo, quarto_maximo, vaga_minima, vaga_maxima = possibilidade
        while controle_de_area <= 0.3:
            area_minima = target.areaPrivate * (1 - controle_de_area)
            area_maxima = target.areaPrivate * (1 + controle_de_area)
            df_ = df.filter((df.areaPrivate.between(area_minima, area_maxima)) &
                   (df.bedrooms.between(quarto_minimo, quarto_maximo)) &
                   (df.parkingSpaces.between(vaga_minima, vaga_maxima)))
            if df_.count() >= 10:
                return [[area_minima, area_maxima, quarto_minimo, quarto_maximo, vaga_minima, vaga_maxima], df_]
            else:
                controle_de_area += 0.1
                if df_.count() > backup_maior_amostra.count():
                    backup_maior_amostra = df_


    return [[area_minima, area_maxima, quarto_minimo, quarto_maximo, vaga_minima, vaga_maxima],
            backup_maior_amostra] # nenhuma amostra com mais de 10 elementos



def get_lista_possiblidades_quarto_vaga(quarto, vaga):

    quarto_menos_1 = quarto - 1
    quarto_mais_1 =  quarto + 1
    vaga_menos_1 = vaga - 1
    vaga_mais_1 = vaga + 1

    lista_de_possibilidades_quarto_vaga = [(quarto, quarto, vaga, vaga), # a melhor possibilidade

                                           (quarto, quarto_mais_1, vaga, vaga),
                                           (quarto_menos_1, quarto, vaga, vaga),
                                           (quarto, quarto, vaga_menos_1, vaga),
                                           (quarto, quarto, vaga, vaga_mais_1),

                                           (quarto_menos_1, quarto_mais_1, vaga, vaga),
                                           (quarto, quarto, vaga_menos_1, vaga_mais_1),
                                           (quarto_menos_1, quarto, vaga_menos_1, vaga),
                                           (quarto_menos_1, quarto, vaga, vaga_mais_1),
                                           (quarto, quarto_mais_1, vaga_menos_1, vaga),
                                           (quarto, quarto_mais_1, vaga, vaga_mais_1),

                                           (quarto, quarto_mais_1, vaga_menos_1, vaga_mais_1),
                                           (quarto_menos_1, quarto, vaga_menos_1, vaga_mais_1),                                             
                                           (quarto_menos_1, quarto_mais_1, vaga, vaga_mais_1),
                                           (quarto_menos_1, quarto_mais_1, vaga_menos_1, vaga),

                                           (quarto_menos_1, quarto_mais_1, vaga_menos_1, vaga_mais_1)] # pior possiblidade
    return lista_de_possibilidades_quarto_vaga

0 个答案:

没有答案