在Pyspark

时间:2017-09-25 10:04:44

标签: python dictionary lambda pyspark key

我有一些包含一些列的数据框df。我正在尝试做某事我得到一个奇怪的错误,而不是我期待的结果。

我的想法是为dataframe列的每个不同值生成一个数值,并将对"real_value" : "numeric_value"添加到字典中。

保存结果的全局字典是:

dict_res = {}

我有下一个传递值和属性名称的函数,根据全局字典“dict_res”中的atr获取字典,如果值作为键存在于字典中,则返回其数值,如果不,生成定义为float(len(dict_res[atr]) + 1)的新数值。

def indexMethod(value, atr):
    global dict_res
    res = float(len(dict_res[atr]) + 1)
    if value in dict_res[atr]:
        res = dict_res[atr][value]
    else:
        dict_res[atr][value] = res
    return res

下一个代码片段迭代我想要生成数值的属性,并且如果没有将等效于该属性的字典创建到全局字典“dict_res”中,则创建它,然后应用lambda函数上面指定的方法。

for column in columns_to_index:
    udf_func = UserDefinedFunction(lambda value: indexMethod(value, column), DoubleType())
    if(not column in dict_res):
        dict_res[column] = {}
    col2 = udf_func(df[column])
    df = df.withColumn('newCol', col2)
    ....

所以我期望生成具有等价的字典,以及具有与字典中相同等效性的新列。

在此过程之后,我按如下方式打印字典:

print(dict_res)

我得到的结果是下一个:

{'ATR1': {}, 'ATR2': {}, ...}

所以字典是空的。但最重要的错误是,当我尝试显示数据帧'df'时,我得到下一个错误:

KeyError: 'ATR1'

如果我有一个带有该密钥的字典,那怎么可能呢?

希望你能帮助我......

1 个答案:

答案 0 :(得分:0)

我认为你不能通过仅在行上操作的UDF来更新外部python对象(全局或非全局)。

解决问题的另一种方法是使用distinct()

dict_res = dict()
for column in columns_to_index:
    dict_res[column] = df.select(column).distinct().toPandas().to_dict()