微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 PySpark 在列表列表上应用函数

如何解决使用 PySpark 在列表列表上应用函数

我正在尝试在我的 df 上应用一个函数。我的变量是一个列表列表,对于它们中的每一个,我都会应用我的函数,以获得每个结果的列表。

dff = spark.createDataFrame([
('a',[[1,2,3,4],[1,1,3],[3,5,9,6],[12,4,2]]),('b',[[4,0.2,0.3,0.7],1],[2,7,9]]),('c',9],8],[5,[4,6]]),('d',[[2,2],8,6]])],['num','list_apply'])

因此我写了这个函数,我注册了它,但我找不到任何结果,只出现了错误

def calc(data):
  a,b,c,d = data
  dist = a+b+c*d
  if dist < 10:
    return True
  else:
    return False
  
calc_udf = f.udf(lambda x: calc(x),ArrayType(BooleanType()))
spark.udf.register("calc_udf",calc,T.ArrayType(T.BooleanType()))

dff = dff.withColumn("dist",f.expr("TRANSFORM(list_apply,x -> calc_udf(x))"))

我想获得的是:

+-----+------------+-------------------------------------+
| num | list_apply |                 dist                |
+-----+------------+-------------------------------------+
| a   |    ...     | [False,True,False,False]         |
| b   |    ...     | [True,False]                 |
| c   |    ...     | [False,False] |
| d   |    ...     | [True,False]                |


解决方法

您的方法的问题在于,在 transform 函数中,您使用 udf 将列表作为参数,这是行不通的,因为 udf 应该采用列(或列名)作为论据。可以修改 calc_udf 取一个列表类型列如下,然后直接在 list_apply 列上使用:

# instead of calc(x) we iterate through lst so we don't need transform
calc_udf = f.udf(lambda lst: [calc(x) for x in lst],ArrayType(BooleanType()))
dff = dff.withColumn("dist",calc_udf("list_apply"))

dff.show()
+---+--------------------+--------------------+
|num|          list_apply|                dist|
+---+--------------------+--------------------+
|  a|[[1.0,2.0,3.0,...|[false,true,fal...|
|  b|[[4.0,0.2,0.3,...| [true,false]|
|  c|[[1.0,1.0,false,fa...|
|  d|[[2.0,...|[true,false]|
+---+--------------------+--------------------+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?