请帮我在python中为spark编写一个自定义分区函数。
我有一个文件告诉条目数据键和分区ID之间的映射,我首先将它加载到一个dict变量" data_to_partition_map"在main.py中
然后在Spark
sc.parallelize(input_lines).partitionBy(numPartitions=xx, partitionFunc=lambda x : data_to_partition_map[x])
当我在本地运行此代码时,它会出错:
Traceback (most recent call last):
File "/home/weiyu/workspace/dice/process_platform_spark/process/roadCompile/main.py", line 111, in <module>
.partitionBy(numPartitions=tile_partitioner.num_partitions, partitionFunc=lambda x: tile_tasks_in_partitions[x])
File "/home/weiyu/app/odps-spark/python/lib/pyspark.zip/pyspark/rdd.py", line 1785, in partitionBy
File "/home/weiyu/app/odps-spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1392, in __call__
File "/home/weiyu/app/odps-spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 289, in get_command_part
AttributeError: 'function' object has no attribute '_get_object_id'
似乎Spark无法序列化lambda对象,是否有人对此错误有任何了解并告诉我如何修复它?非常感谢
答案 0 :(得分:1)
您是否曾尝试使用仅返回dict项的函数,并将其作为参与函数传递?
def return_key(x):
return your_dict[x]
将其作为partitionFunction传递。