我有一个大约 70 列的 RDD。它存储为 tsv。以下是我使用 Python 阅读它的方式:
txtFiles = sc.textFile("temp/txtFiles/*") \
.map(lambda x: x.split("\t"))
这会读入文件,然后沿着选项卡将其拆分为 70 列。理想情况下,我的代码的下一部分将如下所示:
asDouble = txtFiles.map(lambda y: MISSING VALUE if len(x) == 0 \
else float(x) for x in y)
到目前为止,我还无法实现这一目标。如果我想创建一个维护缺失值的 RDD,它必须是一个“Any”类型的数组,并且它将 NA 保存为字符串,将数值保存为 double 值。
这是我的问题的关键:我想将每一行转换为 LabeledPoint 对象,沿着这些思路:
lblPt = asDouble.map(lambda x: LabeledPoint(x[70], x[0:69]))
但是,由于 asDouble 中的数据实际上是“Any”类型,因此它不允许我将其转换为一组 LabeledPoints。 LabeledPoint 对象仅需要 double 。
是否有一种方法可以对 RDD 中的缺失值进行编码,以便 RDD 可用于各种机器学习问题,例如决策树、朴素贝叶斯等?
最佳答案
解决方案最终将我想要的缺失值
编码为None
。然而,len
并没有像我希望的那样工作。相反,我意识到我的数据缺少编码为 'NaN'
的值。
所以我的解决方案如下所示:
txtFiles = sc.textFile("temp/txtFiles/*") \
.map(lambda x: x.split("\t"))
asDouble = txtFiles.map(lambda y: None if x == 'Nan' \
else float(x) for x in y)
lblPt = asDouble.map(lambda x: LabeledPoint(x[70], x[0:69]))
我对缺失值如何存储在原始数据集中有一个根本性的误解(我认为它们是空字符串,但实际上它们存储为 'NaN'
(字符串)。我还需要找到关键字None
。
关于python - 在 Spark 中使用带有缺失值的 MLLib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31968513/