Spark MLLib Kmeans 来自数据帧,然后再次返回

2023-11-24

我的目标是使用 Spark (1.3.1) MLLib 将 kmeans 聚类算法应用于非常大的数据集。我已经使用 Spark 中的 hiveContext 调用了 HDFS 中的数据,并且最终希望以这种方式将其放回原处 - 以这种格式

    |I.D     |cluster |
    ===================
    |546     |2       |
    |6534    |4       |
    |236     |5       |
    |875     |2       |

我运行了以下代码,其中“data”是双精度数的数据框,以及第一列的 ID。

    val parsedData = data.rdd.map(s => Vectors.dense(s.getDouble(1),s.getDouble(2))).cache()
    val clusters = KMeans.train(parsedData, 3, 20)

它运行成功,我现在被困在如上所述的数据帧中将集群映射回它们各自的 ID。我可以使用以下方法将其转换为数据框:

    sc.makeRDD(clusters.predict(parsedData).toArray()).toDF()

但据我所知。这个帖子走在正确的轨道上,并且这个帖子我认为正在问与我类似的问题。

我怀疑需要labeledPoint 库。任何评论,答案将不胜感激,干杯。

编辑:刚刚发现this在 Spark 用户列表中,看起来很有前途


我知道你想最后得到 DataFrame 。我看到两种可能的解决方案。我想说,在它们之间进行选择是品味问题。

从 RDD 创建列

以 RDD 的形式获取 id 和 cluster 对非常容易:

val idPointRDD = data.rdd.map(s => (s.getInt(0), Vectors.dense(s.getDouble(1),s.getDouble(2)))).cache()
val clusters = KMeans.train(idPointRDD.map(_._2), 3, 20)
val clustersRDD = clusters.predict(idPointRDD.map(_._2))
val idClusterRDD = idPointRDD.map(_._1).zip(clustersRDD)

然后你从中创建 DataFrame

val idCluster = idClusterRDD.toDF("id", "cluster")

它之所以有效,是因为地图不会改变 RDD 中数据的顺序,这就是为什么你可以只用预测结果压缩 id。

使用UDF(用户定义函数)

第二种方法涉及使用clusters.predict方法作为 UDF:

val bcClusters = sc.broadcast(clusters)
def predict(x: Double, y: Double): Int = {
    bcClusters.value.predict(Vectors.dense(x, y))
}
sqlContext.udf.register("predict", predict _)

现在我们可以使用它来向数据添加预测:

val idCluster = data.selectExpr("id", "predict(x, y) as cluster")

请记住,Spark API 不允许取消 UDF 注册。这意味着闭包数据将保存在内存中。

错误/非最佳解决方案

  • Using clusters.predict without broadcasting

It won't work in the distributed setup. Edit: actually it will work, I was confused by implementation of predict for RDD, which uses broadcast.

  • sc.makeRDD(clusters.predict(parsedData).toArray()).toDF()

toArray收集驱动程序中的所有数据。这意味着在分布式模式下,您将把集群 ID 复制到一个节点中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spark MLLib Kmeans 来自数据帧,然后再次返回 的相关文章

随机推荐

  • 如何使用msbuild创建nuget包而不重建项目?

    我想设置一个包含构建 测试和部署阶段的 CI CD 管道 我可以在构建阶段构建我的项目 msbuild src MyProject csproj t Restore msbuild src MyProject csproj p Config
  • 尝试导入错误:“firebase/app”不包含默认导出(导入为“firebase”)

    我尝试使用 React 进行 firebase 身份验证 但它显示错误 Attempted import error firebase app does not contain a default export imported as fi
  • gpus_ReturnGuiltyForHardwareRestart 崩溃

    应用程序在presentFrameBuffer中崩溃 在前台运行时 没有发生中断 它没有在第一帧中崩溃 它绘制了一段时间然后突然崩溃 我没有具体的重现步骤 但似乎与绘制特定的内容有关 但我仍然没有通过应用程序报告 openGL 错误 包括在
  • x86 BSWAP 指令 REX 不遵循 Intel 规范?

    我一直在使用 NASM 和 GAS 汇编 和反汇编 BSWAP x64 指令 并且都汇编指令BSWAP r15 as 490FCF以十六进制表示 反汇编器也将其反汇编为相同的指令 指令的 REX 前缀 49 因此设置了 REX W 位 位
  • 导出到 Excel 时,SSRS 不支持 CanGrow 属性

    我在 SSRS 报告中有一个表 表格单元之一包含订单中零件的描述 这些描述的长度可能会有所不同 因此我将 CanGrow 属性设置为 True 当我尝试将报告导出到 Excel 时 我希望如果文本长度超过单元格的宽度 那么单元格的高度将会增
  • $(window) 绑定 hashchange 如何检查部分哈希更改?

    我在学习Google Ajax Crawlable I use window bind hashchange控制ajax页面加载 我的网址如下 domain com keywords num 1 有两种改变 domain com apple
  • 在 OpenGLES 中让精灵正确面对相机

    我有一款或多或少是 2D 的游戏 但以 3D 渲染 摄像机悬停在 2D 游戏场上方 与完全垂直的角度倾斜约 20 度 从而为其提供一点 3D 视角 我有一些精灵需要渲染为完美的正方形 因为它们代表球形物体 我的第一种方法将四边形渲染在 2D
  • STL - 以下代码有什么问题?

    include stdafx h include
  • PDF 到 Github 风格的 Markdown

    我有一个 PDF 格式的项目描述 如果我能以某种方式设法在 github 网站上预览它 而不是单击 查看原始数据 并下载它 我会非常高兴 我以为可能有一个从 pdf 到 github 风格的 markdown 的转换器 但没有找到 再次声明
  • 字典应用程序的数据库设计

    目前我想开发移动设备的词典应用程序 词典本身使用离线文件 数据库来翻译单词 它只翻译两种语言 例如英语 西班牙语词典 我脑子里有一个简单的设计 这将是两个表 英语表和西班牙语表 每个表包含 word id id 它将作为其他表的外键 词 词
  • 重命名 cassandra 集群名称 1.2.6 时出错

    我在具有单个节点的集群中使用 cassandra 1 2 6 我正在尝试使用以下说明重命名集群 Cassandra 集群名称不匹配 完成所有步骤后 当我更改 cassandra yaml 文件后启动 cassandra 时 我继续出现相同的
  • matplotlib 再次显示图形

    使用 matplotlib 时 from matplotlib import pyplot as plt figure plt figure ax figure add subplot 111 ax plot x y figure show
  • 废弃的命名信号量未释放

    当 C 程序持有命名信号量时 当应用程序提前终止 例如按 Ctrl C 或关闭控制台窗口 时 它似乎不会被释放 至少在该进程的所有实例都终止之前不会 对于命名互斥体 在这种情况下会引发 AbandonedMutexException 但对于
  • 如何让 Subversion(或任何程序)执行定期提交?

    我想配置我的计算机 以便每半小时自动提交我正在处理的程序 我正在使用 svn 存储库 因此即使它只是一个每 30 分钟运行一次 svn ci 的脚本也没关系 问题是我不知道该怎么做 有人可以告诉我 或者指导我去做一些事情 让我让这个定期提交
  • 在新选项卡中打开链接[重复]

    这个问题在这里已经有答案了 我为我正在做的一个项目创建了一个网站 网站内容中有一些可以访问的外部网页的链接 同时 当用户单击其中一个链接时 他将被带到指定的链接 并且他将不再位于当前页面上 我想要做的是 当用户单击链接时 单击的链接中的指定
  • 如何确保 Rails API 免受 CSRF 的保护?

    我一直在使用 REST API 开发 Rails 应用程序 以便从移动应用程序进行访问 它运作得很好 当用户从移动应用程序登录时 他会得到auth token他在将来的 API 请求中使用它 问题是 API 也可以通过路径 api v1 从
  • python - 创建数据透视表

    我正在尝试从 python 中的 Numpy 数组创建数据透视表 我做了很多研究 但找不到直接的解决方案 我知道你可以用 Pandas 来做到这一点 但我在安装它时遇到了麻烦 但一定有一种方法可以在没有 Pandas 的情况下做到这一点 我
  • cakephp 在数据源默认值中找不到模型表

    我的数据库中只有一个名为 ficha seg 的表 我的模型文件的名称是 Ficha php 控制器的名称是 FichasController php 那么 为什么我收到错误 Error Table fichas for model Fic
  • 使用指针迭代 argv[]

    我想使用以下代码 但不使用 索引数组并用指针替换它 for int i 0 i lt argc i for int j 0 argv i j 0 j code 我知道您可以使用指针来遍历数组 但我不确定如何使用第二个数组中未定义的长度 在本
  • Spark MLLib Kmeans 来自数据帧,然后再次返回

    我的目标是使用 Spark 1 3 1 MLLib 将 kmeans 聚类算法应用于非常大的数据集 我已经使用 Spark 中的 hiveContext 调用了 HDFS 中的数据 并且最终希望以这种方式将其放回原处 以这种格式 I D c