python - 在 Spark 中使用带有缺失值的 MLLib

标签 python null apache-spark rdd

我有一个大约 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/

相关文章:

python - paramiko 中的代理命令

python:这是从字典中删除元素的错误方法吗?

null - MDX 替换 null - 获取尺寸范围

null - Webbrowser 控件的 window.external 始终为 null

docker - 无法访问位于 Docker 容器内的 Spark Web UI

python "InterfaceError: Error binding parameter 2 - probably unsupported type."

python - 将元字符写入列表

mysql更新增量int字段为空

apache-spark - Spark SQL 中使用的嵌套 java bean

scala - 收集和计数操作之间有什么区别?