将元组列表作为参数传递给 scala 中的 Spark udf

2023-12-20

我正在尝试将元组列表传递给 scala 中的 udf。我不确定如何为此准确定义数据类型。我试图将其作为整行传递,但它无法真正解决它。我需要根据元组的第一个元素对列表进行排序,然后发回 n 个元素。我已经尝试过以下 udf 定义

def udfFilterPath = udf((id: Long, idList: Array[structType[Long, String]] )

def udfFilterPath = udf((id: Long, idList: Array[Tuple2[Long, String]] )

def udfFilterPath = udf((id: Long, idList: Row)

idList 如下所示:

[[1234,"Tony"], [2345, "Angela"]]
[[1234,"Tony"], [234545, "Ruby"], [353445, "Ria"]]

这是一个像上面一样有 100 行的数据框。我这样称呼udf:

testSet.select("id", "idList").withColumn("result", udfFilterPath($"id", $"idList")).show

当我打印数据帧的架构时,它会将其读取为结构数组。 idList 本身是通过对按键分组并存储在数据帧中的一列元组进行收集列表来生成的。关于我做错了什么有什么想法吗?谢谢!


定义 UDF 时,您应该使用普通的 Scala 类型(例如元组、基元...)并且notSpark SQL 类型(例如StructType)作为输出类型.

至于input类型 - 这就是它变得棘手的地方(并且没有太多记录) - 元组数组实际上是一个mutable.WrappedArray[Row]。所以 - 你必须“转变”首先将每一行放入一个元组中,然后您可以进行排序并返回结果。

最后,根据你的描述,似乎id根本不使用列,因此我将其从 UDF 定义中删除,但可以轻松将其添加回来。

val udfFilterPath = udf { idList: mutable.WrappedArray[Row] =>
  // converts the array items into tuples, sorts by first item and returns first two tuples:
  idList.map(r => (r.getAs[Long](0), r.getAs[String](1))).sortBy(_._1).take(2)
}

df.withColumn("result", udfFilterPath($"idList")).show(false)

+------+-------------------------------------------+----------------------------+
|id    |idList                                     |result                      |
+------+-------------------------------------------+----------------------------+
|1234  |[[1234,Tony], [2345,Angela]]               |[[1234,Tony], [2345,Angela]]|
|234545|[[1234,Tony], [2345454,Ruby], [353445,Ria]]|[[1234,Tony], [353445,Ria]] |
+------+-------------------------------------------+----------------------------+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将元组列表作为参数传递给 scala 中的 Spark udf 的相关文章

随机推荐

  • 从 SQL 连接到 Web 服务

    SQL Server 能够使用数据提供程序 例如 JET ACE 和 OPENROWSET 打开 Excel 工作表 xlsx 访问数据库 mdb 和其他数据流 是否有类似的工具可以从远程 Web 服务中提取数据 使用 OPENROWSET
  • MySql IEEE 浮点 NaN、PositiveInfinity、NegativeInfinity

    我已经看过很多关于这个问题的问题 但我还没有找到解决方案 希望这不是一个重复的问题 Problem 如果我执行以下任一操作 INSERT INTO Numbers Number VALUES NaN INSERT INTO Numbers
  • CORS节点js问题

    在浏览了堆栈上的多个帖子后 我仍然找不到正确的答案 检查了文档CORS https github com expressjs cors user content simple usage enable all cors requests扩展
  • WPF。如何通过绑定停止数据触发动画?

    在 WPF 工具包数据网格中 我有一个绑定到单元格元素不透明度的数据触发器 When UpVisibility更改为 1 路径变得可见 并且动画开始将其淡化为 0 这有效 然而我现在的问题 如果我需要提前停止 取消褪色并设置UpVisibi
  • 如何在 Docker 上运行 .exe 文件?

    我目前正在尝试了解和学习Docker 我有一个应用程序 exe 文件 我想通过创建 Docker 在 Linux 或 OSX 上运行它 我在网上搜索过 但找不到任何可以做到这一点的东西 而且我对 Docker 还不够了解 无法尝试即兴创作一
  • 格式化具有多个百分号的字符串

    I know 用于逃避实际 字符串中的符号 所以 ds最终会是 10s在以下格式字符串中 但我不知道为什么我需要 5s在这个字符串中 毕竟 只有两个附加参数 BUFFSIZE 10 define BUFFSIZE 100 char buf
  • sapply 与复合函数的速度比较

    gt system time sapply rnorm 1000000 0 1 function x round x 2 user system elapsed 2 78 0 11 2 89 gt system time round rno
  • cref 不在对象浏览器中创建链接

    我在 C 2010 类库中有以下代码
  • 如何在css中定义多个类的hover事件?

    在CSS中 如何定义多个类的悬停事件以使用相同的属性 这似乎不起作用 my div hover my td hover border 1px solid red Thanks 您应该用逗号分隔 如下所示 my div hover my td
  • 以编程方式更改 ActionBar 选项卡下划线颜色

    我已经创建了操作栏 ActionBar actionbar getActionBar 操作栏的背景更改为 actionbar setBackgroundDrawable actionBarBackgroundImage 现在我需要以编程方式
  • Python,日志记录:使用带有字典配置的自定义处理程序?

    这是关于 Python 3 2 GNU Linux x86 64 上的日志记录模块 是否可以使用字典配置设置自定义处理程序 这是我正在尝试的代码 import logging import logging config class Cust
  • Android:首选项屏幕从右到左

    这是PreferenceScreen的xml文件 PreferenceCategory 根据我的需要显示为 RTL 但其他组件显示为 LTR 如何让他们RTL 我必须遵循这个link http android developers blog
  • 从 pyodbc 调用过程时出错

    这是我的第一个问题 所以 如果重复或格式错误 我很抱歉 我搜索了其他问题 发现该错误很常见 但出现在多种情况下 我有一个非常简单的 python 代码 我想在 MSSQL 中从 pyodbc 执行一个过程 import pyodbc con
  • tkinter 显示当前标签,删除前一个[重复]

    这个问题在这里已经有答案了 我正在尝试一个程序 它将显示在输入框中输入的相应名称的标签 问题 它重叠并显示标签 而不是消失以前的条目标签 我的编码 import Tkinter as tki class App object def ini
  • Backbone.js Underscore.js 过滤集合与数组

    我基本上正在尝试解决这个问题 但是使用数组并使用相应数组的值返回所有对象 而不仅仅是值 按属性值过滤骨干集合 https stackoverflow com questions 11762105 filter backbone collec
  • 推荐的元元素?

    为我的网站项目建立一个 基本框架 我想知道哪些元元素是真正必要 推荐的 我特别想知道如何处理语言属性 在下面的例子中 我认为 不必要地重复
  • gradle 构建因未知主机异常而失败

    我刚刚安装了新版本的 Android Studio 并尝试使用内置模板创建一个项目 我的环境是 Windows 7 SP1 64 位 在安全域环境中 我是我的计算机上的域管理员 这是我所看到的 C Users stuz AndroidStu
  • 术语“更新数据库”不被识别为 cmdlet、函数、脚本文件或可操作程序的名称。检查[重复]

    这个问题在这里已经有答案了 我正在使用 VS 2015 Community Update 3 当我尝试使用命令重新创建 EF 驱动的数据库时update database在包管理器控制台中 显示错误 术语 更新数据库 不被识别为 cmdle
  • sequelize postgres 将 fn 'date' 与 jsonb 值结合起来

    我需要比较格式字符串MM DD YYYY与postgres中的另一个使用sequelize在jsonb列上 在常规专栏上我会做类似的事情 sequelize where sequelize fn date sequelize col cre
  • 将元组列表作为参数传递给 scala 中的 Spark udf

    我正在尝试将元组列表传递给 scala 中的 udf 我不确定如何为此准确定义数据类型 我试图将其作为整行传递 但它无法真正解决它 我需要根据元组的第一个元素对列表进行排序 然后发回 n 个元素 我已经尝试过以下 udf 定义 def ud