【问题标题】:Key error in dict when applying lambda function over Pyspark在 Pyspark 上应用 lambda 函数时 dict 中的关键错误
【发布时间】:2017-09-25 10:04:44
【问题描述】:

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

我的想法是为数据框列的每个不同值生成一个数值,并将 "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'

如果我有一本带那个键的字典,这怎么可能?

希望你能帮助我...

【问题讨论】:

    标签: python dictionary lambda pyspark key


    【解决方案1】:

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

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

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

    【讨论】:

    • 当我有一个数据框并且它不会被进一步扩展时它很有用。但是,如果以后我也有新数据要处理,并且我想将结果与字典'dict_res'中已经得到的结果结合起来?无论如何,感谢您的回复!
    • 您可以使用subtract,然后使用distinct 并将新数据附加到现有字典中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2021-08-25
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多