在Python RDD中计算Null实例

时间:2015-08-06 13:11:06

标签: python lambda null apache-spark rdd

我有一个字符串的Python RDD。我想知道这些值中有多少是null。以下是如何读取文件的想法:

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

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

[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之后计算。但是,我遇到了同样的错误。

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

2 个答案:

答案 0 :(得分:1)

你的意思是这样吗?

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

答案 1 :(得分:0)

问题是你每行应用lambdas。

错误消息指的是您在矩阵的每一行上调用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')在尝试将其转换为浮动时会给你一个例外,因为它没有有适当的格式。