如何在pyspark的列中查询“无”列表的值

2024-09-28 22:22:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我是pyspark的新手,我想在SYMBOL=[]和SYMBOL=[,]时查询数据帧。 这是符号结构

+------+
|SYMBOL|
+------+
|    []|
|    []|
|    []|
|   [,]|
|    []|
|   [,]|

我尝试使用类似df.filter(array_contains(df.INFO_CSQ.SYMBOL, None)).show() 它无法查询,并且存在警告

> cannot resolve 'array_contains(`INFO_CSQ`.`SYMBOL`, NULL)' due to data type mismatch: Null typed values cannot be used as arguments;;

我想这个问题可能是因为我没有用“无”作为论据,但我不知道要质疑这个问题

但是,当有值作为参数(例如df.filter(array_contains(df.INFO_CSQ.Allele, "A")).select("INFO_CSQ.Allele").show())时,这是有效的

我填写“A”作为参数,结果如下

+------+
|Allele|
+------+
|   [A]|
|   [A]|
|   [A]|
|   [A]|
|   [A]|

Tags: 数据infodf参数show符号filtersymbol
1条回答
网友
1楼 · 发布于 2024-09-28 22:22:57

如果您使用的是Spark>;=2.4,您可以使用transform检查数组中是否有空元素,并对转换结果的array_max进行筛选

如果至少有一个null元素,则转换后的结果将至少有一个True,并且array_max的结果将是True。否则,所有元素都将返回False,因为它们都不是空的,array_max将返回False

df = spark.createDataFrame([[[None]], [[None, None]], [[None, 1]], [[1,1]]], 'symbol array<int>')

df.show()
+   +
|symbol|
+   +
|    []|
|   [,]|
| [, 1]|
|[1, 1]|
+   +

df.filter('array_max(transform(symbol, x -> x is null))').show()
+   +
|symbol|
+   +
|    []|
|   [,]|
| [, 1]|
+   +

对于较早的Spark版本,可以使用UDF:

import pyspark.sql.functions as F

has_null = F.udf(lambda arr: None in arr, 'boolean')

df.filter(has_null('symbol')).show()
+   +
|symbol|
+   +
|    []|
|   [,]|
| [, 1]|
+   +

如果要专门检查[][,],可以使用:

df.filter('symbol in (array(null), array(null, null))').show()
+   +
|symbol|
+   +
|    []|
|   [,]|
+   +

相关问题 更多 >