pyspark:在 lambda 表达式中保留一个函数

pyspark: keep a function in the lambda expression

我有以下工作代码:

def replaceNone(row):
  myList = []
  row_len = len(row)
  for i in range(0, row_len):
    if row[i] is None:
      myList.append("")
    else:
      myList.append(row[i])
  return myList

rdd_out = rdd_in.map(lambda row : replaceNone(row))

这里rowfrom pyspark.sql import Row

然而,它有点冗长和丑陋。是否可以通过直接在 lambda 进程中写入所有内容来避免创建 replaceNone 函数?或者至少简化 replaceNone()?谢谢!

我不确定你的目标是什么。看起来你只是想用空字符串替换 rdd_in 中每一行的所有 None 值,在这种情况下你可以使用列表理解:

rdd_out = rdd_in.map(lambda row: [r if r is not None else "" for r in row])

第一次调用 map 将为 row 中的每个元素创建一个新列表,列表推导会将所有 None 替换为空字符串。

这适用于一个简单的示例(并定义了地图,因为它没有为列表定义):

def map(l, f):
    return [f(r) for r in l]

l = [[1,None,2],[3,4,None],[None,5,6]]
l2 = map(l, lambda row: [i if i is not None  else "" for i in row])

print(l2)
>>> [[1, '', 2], [3, 4, ''], ['', 5, 6]]