如何遍历一列数组,并根据每一行是否包含列表中的项目来标记它



我有一个包含两列的数组。第一个包含名称,第二个包含项目的数组列表,每个名称都不同,行中的每个数组列表都包含聚合在一起的不同值。然后我有一个项目列表。如果没有匹配,我想用yes或no来标记数组中包含值的行,该值也在列表中。这是我迄今为止的代码:

 df1 = df.withColumn("ITEM_FLG", 
              f.when(f.array_intersect(f.col("ITEM_DESCR_SET"), item_list), f.lit("Y"))
              .otherwise("N")
             )

"ITEM_FLG";是我要用值创建的列,"ITEM_DESCR_SET"是包含数组列表的列,而"ITEM_list"包含我要检查的项的列表。然而,当我运行代码时,我会得到">TypeError:无效参数,而不是字符串或列",这是因为我相信item_list。

理想情况下,pyspark或熊猫需要这个。非常感谢。

我们可以使用arrays_overlap()来检查item_list中的任何项是否在您的数组列中。但是,我们需要将item_list列表转换为pyspark数组字段。

这里有一个简单的例子。

data_sdf = spark.sparkContext.parallelize(data_ls).toDF(['names_array'])
# +------------------+
# |       names_array|
# +------------------+
# |   [foo, bar, baz]|
# |[karen, sam, john]|
# +------------------+
# root
#  |-- names_array: array (nullable = true)
#  |    |-- element: string (containsNull = true)
name_list = ['bar', 'carter', 'samantha']
# convert the list to a pyspark ArrayType()
name_psarray = func.array(*[func.lit(k) for k in name_list])
# Column<'array(bar, carter, samantha)'>
data_sdf. 
    withColumn('name_flag',
               func.when(func.arrays_overlap('names_array', name_psarray), func.lit('Y')).
               otherwise(func.lit('N'))
               ). 
    show(truncate=False)
# +------------------+---------+
# |names_array       |name_flag|
# +------------------+---------+
# |[foo, bar, baz]   |Y        |
# |[karen, sam, john]|N        |
# +------------------+---------+

最新更新