计算 Python RDD 中的空实例

Count Null Instances in Python RDD

我有一个 Python 字符串 RDD。我想计算这些值中有多少为空。以下是文件的读入方式:

matrix = sc.textFile("txtFile.txt").map(lambda x: x.split("\t"))

所以,我拥有的是在选项卡上拆分的字符串 RDD。 matrix.first() returns:

[u'1,2010-07-06', u'198125.0', u'0.24641', u'0.27543', u'0.27603', u'8123537.0', u'263157.0', u'3.0', u'13223919.95', u'0.341464030112', u'248514.0', u'3.0', u'30.438234', u'0.3004', u'412455.0', u'22.0', u'-14643.0', u'', u'', u'1']

我的最终目标是按列计算出有多少缺失值。我在从字符串转换为浮点数时遇到问题。这是我首先尝试的:

vals = matrix.map(lambda x: [float(x)])

但是,我得到一个错误 float() argument must be a string or a number

我试过这个:

test = matrix.first() float(test[33]) # since the item at 33 is null

这会产生与之前相同的错误。所以,也许我需要去掉缺失值。

vals = matrix.map(lambda x: [float(x if len(x) > 0 else '-99.99')])

这是试图用我的数据集中一个易于识别但可能不存在的数字来消除缺失值,然后我可以计算这个 -99.99。但是,我遇到了同样的错误。

有更好的方法吗?我只想得到每列中有多少空值的摘要。

你的意思是这样的吗?

import numpy as np
matrix.map(lambda xs: np.array([0 if x else 1 for x in xs])).sum()

关于您的尝试:

vals = matrix.map(lambda x: [float(x)])

不会因为空字符串而失败(它会但不会到达这部分)但是因为作为 x 参数传递的元素是 list.

问题是您在每行应用 lambda。

错误消息是指您在矩阵的每一行上调用 float(x),因此 x 是一个字符串列表。

你必须做的:

matrix = sc.textFile("clean-sl-mix-with-labels.txt").map(lambda x: x.split("\t"))

def clean_row(row):
    return ['-99.99' if len(element) == 0 else float(element)  for element in row]

matrix.map(clean_row)

最重要的是,您有第一列 (u'1,2010-07-06'),在尝试将其转换为浮点数时会出现异常,因为它没有合适的格式.