【问题标题】:How to query when list of None is value in column in pysparkpython - 如何在pyspark的列中查询None列表的值
【发布时间】:2021-04-18 07:07:50
【问题描述】:

我是 pyspark 的新手,我想在 SYMBOL == [] 和 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;;

我想这个问题可能来自我使用 None 作为参数,但我不知道要查询这个。

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

我填写“A”作为参数,结果会是这样的

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

【问题讨论】:

    标签: python sql apache-spark pyspark apache-spark-sql


    【解决方案1】:

    如果您使用的是 Spark >= 2.4,则可以使用 transform 检查数组中是否存在空元素,并根据转换结果的 array_max 进行过滤。

    如果至少有一个空元素,则转换后的结果将至少有一个Truearray_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|
    +------+
    |    []|
    |   [,]|
    +------+
    

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 2022-11-29
      • 2018-03-24
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多