如何在 DataFrame 中跨组使用 QuantileDiscretizer?

2023-12-24

我有一个包含以下列的数据框。

scala> show_times.printSchema
root
 |-- account: string (nullable = true)
 |-- channel: string (nullable = true)
 |-- show_name: string (nullable = true)
 |-- total_time_watched: integer (nullable = true)

这是有关客户观看特定节目的次数的数据。我应该根据观看的总时间对每个节目的客户进行分类。

该数据集共有 1.33 亿行,其中 192 个不同的行show_names.

对于每个单独的节目,我应该将客户分为 3 类(1、2、3)。

我使用 Spark MLlib分位数离散化器 http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.ml.feature.QuantileDiscretizer

目前我循环播放每个节目并运行QuantileDiscretizer按照以下代码所示的顺序方式。

我最终想要的是以下示例输入以获得示例输出。

输入示例:

account,channel,show_name,total_time_watched
acct1,ESPN,show1,200
acct2,ESPN,show1,250
acct3,ESPN,show1,800
acct4,ESPN,show1,850
acct5,ESPN,show1,1300
acct6,ESPN,show1,1320
acct1,ESPN,show2,200
acct2,ESPN,show2,250
acct3,ESPN,show2,800
acct4,ESPN,show2,850
acct5,ESPN,show2,1300
acct6,ESPN,show2,1320

示例输出:

account,channel,show_name,total_time_watched,Time_watched_bin
acct1,ESPN,show1,200,1
acct2,ESPN,show1,250,1
acct3,ESPN,show1,800,2
acct4,ESPN,show1,850,2
acct5,ESPN,show1,1300,3
acct6,ESPN,show1,1320,3
acct1,ESPN,show2,200,1
acct2,ESPN,show2,250,1
acct3,ESPN,show2,800,2
acct4,ESPN,show2,850,2
acct5,ESPN,show2,1300,3
acct6,ESPN,show2,1320,3

有没有一种更有效和分布式的方法来使用一些groupBy类似操作而不是循环遍历每个show_name然后一个接一个地把它扔进垃圾桶?


我一无所知QuantileDiscretizer,但认为您最关心的是要应用的数据集QuantileDiscretizer到。我认为您想弄清楚如何将输入数据集分割成更小的数据集show_name(你说有 192 个不同的show_name在输入数据集中)。

解决方案1:对Parquet数据集进行分区

我注意到您使用镶木地板作为输入格式。我对格式的理解非常有限,但我注意到人们正在使用某种分区方案将大型数据集分割成更小的块,然后他们可以处理他们喜欢的任何内容(根据某些分区方案)。

在您的情况下,分区方案可能包括show_name.

这将使你的情况变得微不足道,因为分割是在编写时完成的(又名不再是我的问题).

See 如何在 Spark 2.1 中保存分区的 parquet 文件? https://stackoverflow.com/q/43731679/1305344

解决方案 2:Scala 的未来

给定您的迭代解决方案,您可以将每次迭代包装成Future https://www.scala-lang.org/api/current/scala/concurrent/Future.html您将提交并行处理。

Spark SQL 的Spark会话 http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.SparkSession(和 Spark Core 的SparkContext http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.SparkContext) 是线程安全的。

解决方案 3:数据集filter and union运营商

在遵循这个解决方案之前我会三思而后行,因为它会给你的肩膀带来负担,我认为这可以通过解决方案 1 轻松解决。

假设您有一个包含 1.33 亿行的大型 Parquet 文件,我首先会为每个文件构建 192 个数据集show_name using filter运算符(就像您构建show_rdd这是反对这个名字的,因为它是DataFrame not RDD) and union(再次像你一样)。

See 数据集API http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Dataset.

解决方案 4:使用窗口函数

我认为这是可行的,但我自己没有检查过。

您可以使用窗口函数(请参阅窗口规范 http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.expressions.WindowSpec和列的over http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Column@over():org.apache.spark.sql.Column操作员)。

窗口函数将为您提供分区(窗口),同时over would somehow apply QuantileDiscretizer到窗口/分区。然而,这需要“解构”QuantileDiscretizer进入一个Estimator训练模型并somehow再次将结果模型拟合到窗口。

我认为这是可行的,但我自己没有做到。对不起。

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

如何在 DataFrame 中跨组使用 QuantileDiscretizer? 的相关文章

随机推荐

  • Visual Studio:添加相同项目或对不同解决方案的引用

    我正在尝试设置我的 Visual Studio 项目 我有一个通用项目 例如 SharedProj 其中包含所有常量 公共类 SharedProj 将被另外两个解决方案 例如 SolnA SolnB 引用 但未来可能会更多 我能想到的有两种
  • 如果我使用 HTML5 文档类型,为什么不能将 div 设为 100% 高度?如何获得 100% 高度

    我正在努力为一个非常简单的画廊 Web 应用程序排序布局 但是当我使用 HTML5 文档类型声明时 我的一些 div 的高度 100 会立即缩小 而且我似乎无法丰满他们使用 CSS 进行备份 我的 HTML 位于https dl dropb
  • 使用Python进行Windows进程管理

    我需要一个脚本来检查特定进程是否正在运行 如果找不到则返回一些内容 我知道这可以使用子进程来完成 但是有没有更简单的方法来做到这一点 在 Windows 上 您可以使用 WMI import win32com client def find
  • 如何在 C# 异常中获取错误号而不是错误消息? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以获取相应的错误代码Exceptions 我需要抛出的异常错误代码而不是其消息 以便我根据错误代码向用户显示正确的消息 如果您正在寻找 win32 错误代码 可以在Win32Exception h
  • 浮动嵌套div的填充高度

    我正在制作一个基本的评论系统 当评论很短时它是完美的 但是当用户写很多时 评论并不像应有的那么花哨 我尝试用高度 100 但它并没有像我预期的那样工作 我希望作者信息填写评论的高度 到目前为止我尝试过的 http jsfiddle net
  • 从新的 youtu.be 网址获取视频 ID

    我有以下代码 可以从旧的共享网址中获取 youtube 的视频 id youtube com watch v adasdalkjsd url GET url parse str parse url url PHP URL QUERY que
  • Glassfish 线程池、接受器线程、HTTP 最大连接数

    请参阅附图 请帮助我理解线程池 最大和最小线程池大小 接受器线程及其最大连接数和 HTTP 最大连接数之间的关系 线程池 HTTP 传输TCP 首先我给你一些官方文档 线程池 线程池是服务器可以处理的并发请求的最大数量 服务器有一个连接队列
  • 使用 EF 和 WebApi 序列化父/子对象

    我在实体框架内有以下模型 public class Customer XmlIgnore public virtual ICollection
  • 刷新/重新启动 PowerShell 会话而不退出

    我一直在调整我的 PowerShell 配置文件中的一些脚本 退出 powershell 然后重新启动它很烦人 这样它就会加载我对我的配置文件中的脚本所做的任何更改 是否可以在不退出的情况下重新启动 powershell 会话 你可以这样做
  • Rails 4 参数数量错误(2 为 1)。可能是 Strong_params 问题

    我将 Rails 4 与 Devise Cancan 和 Rollify 一起使用 我有一个用户索引 其中包含更改角色的模式 但是 当我尝试更新角色时 出现以下错误 参数数量错误 2 为 1 错误发生在我的用户控制器代码的第 16 行 13
  • Oracle 11g 通过正则表达式获取所有匹配的出现

    我正在使用 Oracle 11g 我想使用 REGEXP SUBSTR 来匹配给定模式的所有出现情况 例如 SELECT REGEXP SUBSTR Txa233141b Ta233141 Ta233142 Ta233147 Ta23314
  • Animate.css动画完成后动画消失

    我正在尝试构建一个菜单 每个列表项都有一系列动画 它有效 但动画结束后该项目再次消失 看起来 animated 的可见属性没有被使用 您可以给我任何指示来解决这个问题吗 ul class menu ani item li class ani
  • E:存储库“http://archive.ubuntu.com/ubuntu precision Release”未签名

    我正在尝试通过运行此命令在本地设置 Scrapy docker env docker build t scrapy 我遇到以下错误 Get 20 http archive ubuntu com ubuntu http archive ubu
  • Chrome CustomTabs CustomTabsCallback onPostMessage 未调用

    我正在尝试在 Android 上使用 Chrome CustomTabs 但在使用 CustomTabsCallback 时遇到问题 因此 我在网上搜索了一些在我的代码中实现的示例或文档 但不幸的是我没有找到任何东西 我需要接收托管网页发送
  • Java 中的事件监听器和处理程序有什么区别?

    一般来说 java 中有事件的侦听器和处理程序 我的意思是我在不知不觉中使用它们 只是 API 中可用的 我的问题是 在什么情况下我们使用侦听器以及在什么情况下使用事件处理程序 他们之间有什么区别 特征 我搜索了原因 但找不到 Java 的
  • ConEmu 与 Git Bash - 在选项卡栏中显示文件夹

    我通常在 ConEmu 选项卡中运行 Git Bash 在每个 Git Bash 实例的选项卡栏中显示当前目录的名称确实很方便 但如果我将选项卡模板设置为 d or f 无论我在哪里 我总是可以获得我的 Windows 主目录cd到 Git
  • Apple OS X Server(Xcode CI 服务)找不到配置文件

    我配置了带有 OS X Server 的专用 Mac mini 以便与 XCode5 持续集成 添加了 git 存储库并创建了机器人 我正在尝试集成机器人并收到错误 Specified PROVISIONING PROFILE 29DAD4
  • 如何禁用 Hadoop Kerberos

    我使用内部脚本来设置 Hadoop 集群 默认情况下 它使用 Kerberos 配置 Hadoop 安全性 这对于开发环境来说是非常不方便的 我用谷歌搜索了很多 但结果都是关于 如何启用 请帮忙给一些参考或者建议 更改以下值 core si
  • 将供应商 Android 更改集成到 aosp 中

    我正在尝试将 AOSP 设备更改集成到标准 AOSP 本地镜像中 这有点令人困惑 但我会尽力尽可能清楚 我在服务器 不同的本地计算机 上创建了 AOSP 存储库的本地镜像 供应商补丁基于标签 android 4 3 r2 1 所以我初始化了
  • 如何在 DataFrame 中跨组使用 QuantileDiscretizer?

    我有一个包含以下列的数据框 scala gt show times printSchema root account string nullable true channel string nullable true show name s