我有一个包含两列的数组。第一个包含名称,第二个包含项目的数组列表,每个名称都不同,行中的每个数组列表都包含聚合在一起的不同值。然后我有一个项目列表。如果没有匹配,我想用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 |
# +------------------+---------+