Apache spark 如何";其中;基于列表的最后一个结构类型
假设我有一个名为“arr”的StructType列表列的数据帧,可以用以下json描述: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
{
"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
ispyspark.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)
这正好回答了我的问题。谢谢