PySpark RDD:将字符串映射到整数,删除无效数据



我在PySpark中有一个名为animalRDD的RDD,并且已经删除了头。标题为:animal, animalBreed, nickName, numberLegs

animalRDD如下所示:

[('Dog', 'Poodle', 'Rex', '4'), ('Cat', 'Tabby', 'Digger', 'XXX'), ('Horse', 'Stallion', 'Ozzie', ' '), ('Chicken', 'Rooster', 'Diesel', '2'), ('Bear', 'Black Bear', 'Bazza', '4')]

现在RDD中的每个元素都是一个字符串。我想映射RDD,使腿的数量变成一个整数。

我知道我可以使用以下内容转换为整数:

animalRDD.map(lambda x: (x[0], x[1], x[2], int(x[3])))

但是,数据中有一个字符串"XXX"one_answers"(空白(。有没有办法删除这两个无效点,这样返回的RDD就是这样?

[('Dog', 'Poodle', 'Rex', 4),('Chicken', 'Rooster', 'Diesel', 2), ('Bear', 'Black Bear', 'Bazza', 4)]

谢谢!

如果您不想在输出中删除"XXX"one_answers",可以使用类似的方法:

tup = [('Dog', 'Poodle', 'Rex', '4'), ('Cat', 'Tabby', 'Digger', 'XXX'), ('Horse', 'Stallion', 'Ozzie', ' '), ('Chicken', 'Rooster', 'Diesel', '2'), ('Bear', 'Black Bear', 'Bazza', '4')]
lst = [list(i) for i in tup]
for i in range(len(lst)):
try:
lst[i][3]=int(lst[i][3])
except ValueError:
lst[i] = lst[i]

如果你真的想把它们从列表中完全删除:

tup = [('Dog', 'Poodle', 'Rex', '4'), ('Cat', 'Tabby', 'Digger', 'XXX'), ('Horse', 'Stallion', 'Ozzie', ' '), ('Chicken', 'Rooster', 'Diesel', '2'), ('Bear', 'Black Bear', 'Bazza', '4')]

lst = [list(i) for i in tup]
for i in range(len(lst)):
try:
lst[i][3]=int(lst[i][3])
except ValueError:
del lst[i][3]

然后转换回元组:

tup = [tuple(i) for i in lst]

以下是过滤和映射的方法。

rdd.filter(lambda x: x[3].isdigit()).map(lambda x: (x[0], x[1], x[2], int(x[3]))).collect()
[('Dog', 'Poodle', 'Rex', 4),
('Chicken', 'Rooster', 'Diesel', 2),
('Bear', 'Black Bear', 'Bazza', 4)]

最新更新