Apache spark 如何";其中;基于列表的最后一个结构类型

Apache spark 如何";其中;基于列表的最后一个结构类型,apache-spark,pyspark,pyspark-sql,Apache Spark,Pyspark,Pyspark Sql,假设我有一个名为“arr”的StructType列表列的数据帧,可以用以下json描述: { "otherAttribute": "blabla...", "arr": [ { "domain": "books", "others": "blabla..." } { "domain": "music", "others": "blabla..." } ] } { "otherA

假设我有一个名为“arr”的StructType列表列的数据帧,可以用以下json描述:

{
  "otherAttribute": "blabla...",
  "arr": [
     {
        "domain": "books",
        "others": "blabla..."
     }
     {
        "domain": "music",
        "others": "blabla..."
     }
  ]
}
{
  "otherAttribute": "blabla...",
  "arr": [
     {
        "domain": "music",
        "others": "blabla..."
     }
     {
        "domain": "furniture",
        "others": "blabla..."
     }
  ]
}
... ...

我们希望过滤掉记录,以便“arr”中的最后一个StructType的“domain”属性为“music”。在上面的示例中,我们需要保留第一条记录,但放弃第二条记录。需要帮助才能写出这样的“where”子句。

答案基于以下数据:

+---------------+----------------------------------------------+
|other_attribute|arr                                           |
+---------------+----------------------------------------------+
|first          |[[books, ...], [music, ...]]                  |
|second         |[[books, ...], [music, ...], [furniture, ...]]|
|third          |[[football, ...], [soccer, ...]]              |
+---------------+----------------------------------------------+
arr
这里是一个结构数组。
arr
的每个元素都有属性
其他
(此处填入

数据帧API方法(
F
is
pyspark.sql.functions
):

df.filter(
F.col(“arr”)[F.size(F.col(“arr”))-1][“域”]=“音乐”
)
SQL方式:

选择
其他属性,
啊
来自df
其中arr[size(arr)-1]['domain']='music'
输出表如下所示:

+---------------+----------------------------+
|other_attribute|arr                         |
+---------------+----------------------------+
|first          |[[books, ...], [music, ...]]|
+---------------+----------------------------+
完整代码(建议使用PySpark控制台):

将pyspark.sql.types导入为T
导入pyspark.sql.F函数
schema=T.StructType()\
.add(“其他_属性”,T.StringType())\
.添加(“arr”,T.ArrayType(
T.StructType()
.add(“域”,T.StringType())
.add(“其他”,T.StringType())
)
)
df=spark.createDataFrame([
[“第一”、[[“书”、“…”]、[“音乐”、“…”],
[“第二”、[[“书”、“…”]、[“音乐”、“…”]、[“家具”、“…”],
[“第三”,“足球”,“足球”,“足球”,“足球]]
],架构)
过滤=df.filter(
F.col(“arr”)[F.size(F.col(“arr”))-1][“域”]=“音乐”
)
过滤。显示(100,False)
df.createOrReplaceTempView(“df”)
已使用\u sql=spark.sql(“”)筛选\u
挑选
其他属性,
啊
来自df
其中arr[size(arr)-1]['domain']='music'
""")
使用_sql.show筛选_(100,False)

这正好回答了我的问题。谢谢