自定义分区程序无法在spark中携带局部变量

时间:2017-12-16 11:07:18

标签: python apache-spark pyspark

请帮我在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对象,是否有人对此错误有任何了解并告诉我如何修复它?非常感谢

1 个答案:

答案 0 :(得分:1)

您是否曾尝试使用仅返回dict项的函数,并将其作为参与函数传递?

def return_key(x):
      return your_dict[x]

将其作为partitionFunction传递。