【问题标题】:pyspark: keep a function in the lambda expressionpyspark:在 lambda 表达式中保留一个函数
【发布时间】:2016-06-10 20:18:02
【问题描述】:

我有以下工作代码:

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()?谢谢!

【问题讨论】:

  • 一般我会说这听起来像你想要你的code reviewed,但这很容易通过简单的ternary expression 和列表理解来解决。
  • ...这与我在您收到的答复中所说或提到的任何内容有什么关系?

标签: python apache-spark add pyspark


【解决方案1】:

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

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

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

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

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]]

【讨论】:

  • “地图没有为列表定义”是什么意思?内置的map将callable作为第一个参数,将序列作为第二个参数,只需交换参数的顺序即可,无需重新定义。
  • 这有点棘手,因为 Row 元素无法重新分配,row[i] = "" 不起作用。
  • @TadhgMcDonald-Jensen 我忘了有一个内置的通用地图。既然你不能打电话给[1,2,3].map(),我(愚蠢地)只是做了一个新功能。
  • @zephyr1999:我将如何在 rdd_in 上使用您的地图功能?谢谢!
  • @Edamame 你不需要。我只使用它是因为我不想通过设置 RDD 来进行测试。您应该可以在我的答案中使用rdd_out = ... 代码行来代替您的整个代码块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多