PySpark join возвращает пустой словарь, а не None

#python #pyspark #pagerank

#python #pyspark #pagerank

Вопрос:

У меня есть RDD:

 [('4', 1),
 ('1', 1),
 ('8', 1),
 ('9', 1),
 ('10', 1),
 ('2', 1),
 ('3', 1),
 ('5', 1),
 ('6', 1),
 ('7', 1),
 ('11', 1)]
  

Я пытаюсь соединить leftOuterJoin () этот RDD с другим:

 [('2', ({'3': 1}, 1)),
 ('3', ({'2': 1}, 1)),
 ('4', ({'1': 1, '2': 1}, 2)),
 ('5', ({'4': 1, '2': 1, '6': 1}, 3)),
 ('6', ({'2': 1, '5': 1}, 2)),
 ('7', ({'2': 1, '5': 1}, 2)),
 ('8', ({'2': 1, '5': 1}, 2)),
 ('9', ({'2': 1, '5': 1}, 2)),
 ('10', ({'5': 1}, 1)),
 ('11', ({'5': 1}, 1))]
  

Таким образом, одна из моих возвращенных записей является

 ('1', (1, None)),
  

Для справки, другие записи выглядят как:

 [('4', (1, ({'1': 1, '2': 1}, 2))),
  

Это вызывает у меня проблемы, поскольку мне нужно разобраться с данными позже, и мне нужен пустой словарь, а не None. Т.е. ('1', (1, ({}, 0))) Какой был бы чистый способ сделать это?

Ответ №1:

Вы могли бы сделать это следующим образом с помощью map и проверить на None :

 def rep(r):
  if r[1][1] == None:
    return (r[0], (r[1][0],({},0)))
  return r

rdd_left.leftOuterJoin(rdd_right).map(rep).collect()
  

Это дает желаемый результат для ваших данных примера.