针对结构的数组内的Spark SQL搜索

时间:2017-02-14 19:06:15

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

我的数据结构大致定义如下:

schema = StructType([
# ... fields skipped
StructField("extra_features", 
ArrayType(StructType([
    StructField("key", StringType(), False),
    StructField("value", StringType(), True)
])), nullable = False)],
)

现在,我想在数据框中搜索结构{"key": "somekey", "value": "somevalue"}存在于数组框中的条目。我该怎么做?

1 个答案:

答案 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()
  




导致:




 < 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;