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))
这里row
是from 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]]
我有以下工作代码:
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))
这里row
是from 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]]