我的数据结构大致定义如下:
schema = StructType([
# ... fields skipped
StructField("extra_features",
ArrayType(StructType([
StructField("key", StringType(), False),
StructField("value", StringType(), True)
])), nullable = False)],
)
现在,我想在数据框中搜索结构{"key": "somekey", "value": "somevalue"}
存在于数组框中的条目。我该怎么做?
答案 0 :(得分:1)
Spark有一个函数 array_contains
,可用于检查 ArrayType
列的内容,但不幸的是,它似乎不能处理复杂类型的数组。但是可以使用UDF(用户定义函数)来执行此操作:
来自pyspark.sql.types import *& #xA;来自pyspark.sql import Row
将pyspark.sql.functions导入为F

 schema = StructType([StructField(“extra_features”,ArrayType(StructType([
 StructField(“ key“,StringType(),False),
 StructField(”value“,StringType(),True)])),
 False)])

 df = spark。 createDataFrame([
 Row([{'key':'a','value':'1'}]),
 Row([{'key':'b','value': '2'}]),schema)

#UDF检查{'key':'a','value':'1'}是否在一个数组
 #the actual (嵌套的)StructType值的数据是一行
 contains_keyval = F.udf(lambda extra_features:在extra_features中的行(key ='a',value ='1'),BooleanType())
&# xA; df.where(contains_keyval(df.extra_features))。collect()



 这导致:
&# xA;
 [Row(extra_features = [Row(key = u'a',value = u'1')])]

& #xA;
 哟你还可以使用UDF添加另一列来指示键值对是否存在:


 df.withColumn('contains_it',contains_keyval(df) .extra_features))。collect()



 导致:
&#xA;&#xA;< code> [Row(extra_features = [Row(key = u'a',value = u'1')],contains_it = True),&#xA;行(extra_features = [Row(key = u'b',value = u'2')],contains_it = False)]&#xA;&#xA;