使用 Pyspark 或 SQL 从图像列中查找唯一图像名称

Posted

技术标签:

【中文标题】使用 Pyspark 或 SQL 从图像列中查找唯一图像名称【英文标题】:Finding Unique Image name from Image column using Pyspark or SQL 【发布时间】:2019-06-28 06:29:53 【问题描述】:

我的数据集如下所示:

key|StateName_13|lon|lat|col5_13|col6_13|col7_13|ImageName|elevation_13|Counter_13
P00005K9XESU|FL|-80.854196|26.712385|128402000128038||183.30198669433594|USGS_NED_13_n27w081_IMG.img|3.7742109298706055|1
P00005KC31Y7|FL|-80.854196|26.712385|128402000128038||174.34959411621094|USGS_NED_13_n27w082_IMG.img|3.553356885910034|1
P00005KC320M|FL|-80.846966|26.713182|128402000100953||520.3673706054688|USGS_NED_13_n27w081_IMG.img|2.2236201763153076|1
P00005KC320M|FL|-80.84617434521485|26.713200344482424|128402000100953||520.3673706054688|USGS_NED_13_n27w081_IMG.img|2.7960102558135986|2
P00005KC320M|FL|-80.84538|26.713219|128402000100953||520.3673706054688|USGS_NED_13_n27w081_IMG.img|1.7564013004302979|3
P00005KC31Y6|FL|-80.854155|26.712083|128402000128038||169.80172729492188|USGS_NED_13_n27w081_IMG.img|3.2237753868103027|1
P00005KATEL2|FL|-80.861664|26.703649|128402000122910||38.789894104003906|USGS_NED_13_n27w081_IMG.img|3.235154628753662|1

在这个数据集中,我想找到重复的 lon,lat 并想要那些 lon 和 lat 对应的图像名称。

输出应如下所示:

lon|lat|ImageName
-80.854196|26.712385|USGS_NED_13_n27w081_IMG.img,USGS_NED_13_n27w082_IMG.img

由于第 1 行和第 2 行具有相似的 lon 和 lat 值,但图像名称不同。 任何 pyspark 代码或 sql 查询都有效。

【问题讨论】:

试试df = df.groupby(['lon','lat']).agg(F.collect_set('ImageName'))? agg(F.collect_set ---> F 在这里表示什么。 import pyspark.sql.functions as F 您确实应该将自己的代码尝试添加到问题中。 SO 不是(应该是)代码编写服务。 在报告问题后已经草草写下了我的代码。在下面找到我的代码 【参考方案1】:

使用@giser_yugang 评论,我们可以做这样的事情:

from pyspark.sql import functions as F

df = df.groupby(
    'lon',
    'lat'
).agg(
    F.collect_set('ImageName').alias("ImageNames")
).where(
    F.size("ImageNames")>1
)

df.show(truncate=False)
+----------+---------+----------------------------------------------------------+
|lon       |lat      |ImageNames                                                |
+----------+---------+----------------------------------------------------------+
|-80.854196|26.712385|[USGS_NED_13_n27w081_IMG.img, USGS_NED_13_n27w082_IMG.img]|
+----------+---------+----------------------------------------------------------+

如果需要写成csv,格式不支持ArrayType,可以使用concat_ws

df = df.withColumn(
    "ImageNames",
    F.concat_ws(
        ", "
        "ImageNames"
    )
)

df.show()
+----------+---------+--------------------------------------------------------+ 
|lon       |lat      |ImageNames                                              |
+----------+---------+--------------------------------------------------------+
|-80.854196|26.712385|USGS_NED_13_n27w081_IMG.img, USGS_NED_13_n27w082_IMG.img|
+----------+---------+--------------------------------------------------------+

【讨论】:

已尝试:dup_df = data.groupBy('lon_13','lat_13').agg(collect_list("ImageName_13").alias("ImageName_13")).where(size("ImageName_13" )>1) @SahilNagpal 是一样的,不是吗? 我面临的问题是我无法将我的数据框写入 csv 或文本,因为数据框不支持将 set 或 list(Array) 数据类型转换为 csv 或文本。跨度> 我正在运行这个:dup_df = data.groupBy('lon_13','lat_13').agg(collect_set("ImageName_13").alias("ImageName_13")).where(size(" ImageName_13")>1) newdup = dup_df.withColumn("ImageName_13",concat_ws(", ""ImageName_13")) newdup.show(20,False) 我有一个空的图像列 join_udf = udf(lambda x: ",".join(x)) df.withColumn("test_123", join_udf(col("test_123"))).show() 这就是我试过了

以上是关于使用 Pyspark 或 SQL 从图像列中查找唯一图像名称的主要内容,如果未能解决你的问题,请参考以下文章

在 spark sql--pyspark 中查找特定字符串

如何删除 Spark 表列中的空格(Pyspark)

PySpark查找另一列中是否存在一列中的模式

从 pyspark 中的数据框数组类型列中获取“名称”元素

分解表以在列中进行透视(SQL,PYSPARK)

如何在 PySpark 中的 RDD 中的列中查找标准差