在2个Spark数据框列之间使用“ IS IN”

Ann*_*eso 2 apache-spark apache-spark-sql pyspark pyspark-sql

我有上面的数据框:

from pyspark.sql.types import *

rdd = sc.parallelize([
        ('ALT', ['chien', 'chat'] , 'oiseau'),
        ('ALT', ['oiseau']        , 'oiseau'),
        ('TDR', ['poule','poulet'], 'poule' ),
        ('ALT', ['ours']          , 'chien' ),
        ('ALT', ['paon']          , 'tigre' ),
        ('TDR', ['tigre','lion']  , 'lion'  ),
        ('ALT', ['chat']          ,'chien'  ),
])
schema = StructType([StructField("ClientId",StringType(),True),
                     StructField("Animaux",ArrayType(StringType(),True),True),
                     StructField("Animal",StringType(),True),])
test = rdd.toDF(schema)
test.show()
Run Code Online (Sandbox Code Playgroud)
+--------+---------------+------+
|ClientId|        Animaux|Animal|
+--------+---------------+------+
|     ALT|  [chien, chat]|oiseau|
|     ALT|       [oiseau]|oiseau|
|     TDR|[poule, poulet]| poule|
|     ALT|         [ours]| chien|
|     ALT|         [paon]| tigre|
|     TDR|  [tigre, lion]|  lion|
|     ALT|         [chat]| chien|
+--------+---------------+------+
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列,如果“ Animal”列中的字符串位于“ Animaux”列中的列表中,则取值为“ 1”,否则为“ 0”。

我试过了:

test2=test.withColumn("isinlist", F.when("Animal in Animaux", 'ok').otherwise('pas ok'))
test2=test.withColumn("isinlist", F.when(test.Animal.isin(*test.Animaux), 'ok').otherwise('pas ok'))
test.where("Animal in (Animaux)").show()
test.where("Animal in Animaux").show()
test2=test.withColumn("isinlist", F.when(test.Animal.isin(test.Animaux), 'ok').otherwise('pas ok'))
Run Code Online (Sandbox Code Playgroud)

但是它们都不起作用。有人知道不使用udf怎么做。有直接的方法吗?

hi-*_*zir 7

您可以使用array_contains

from pyspark.sql.functions import expr

test.withColumn("isinlist", expr("array_contains(Animaux, Animal)")).show()
# +--------+---------------+------+--------+
# |ClientId|        Animaux|Animal|isinlist|
# +--------+---------------+------+--------+
# |     ALT|  [chien, chat]|oiseau|   false|
# |     ALT|       [oiseau]|oiseau|    true|
# |     TDR|[poule, poulet]| poule|    true|
# |     ALT|         [ours]| chien|   false|
# |     ALT|         [paon]| tigre|   false|
# |     TDR|  [tigre, lion]|  lion|    true|
# |     ALT|         [chat]| chien|   false|
# +--------+---------------+------+--------+
Run Code Online (Sandbox Code Playgroud)

如果一个列是另一列的成员,则如何0323(Scala)过滤Spark数据帧

  • 为什么 `"array_contains(Animaux, Animal)"` 在 `expr` 中工作,但不能直接在函数 `array_contains` 中工作? (2认同)
  • @Steven因为没有`array_contains`((column:Column,value:Column)=> Column`,只有`(column:Column,value:Any)=> Column`其中`Any`应该是局部值。因此只是缺少必需的实现。 (2认同)