Поиск уникального имени изображения из столбца изображения с использованием Pyspark или SQL

У меня есть набор данных, который выглядит так:

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 имеют одинаковые значения долготы и широты, но разные имена изображений. Любой код pyspark или sql-запрос работают.

Попробуйте df = df.groupby(['lon','lat']).agg(F.collect_set('ImageName'))?

giser_yugang 28.06.2019 09:46

agg(F.collect_set ---> что здесь означает F.

vegetarianCoder 28.06.2019 09:52

импортировать pyspark.sql.functions как F

giser_yugang 28.06.2019 09:52

Вы действительно должны добавить свою собственную попытку кода к вопросу. SO не является (должен быть) службой написания кода.

PM 2Ring 28.06.2019 09:53

Набросал мой код после сообщения о вопросе. Найдите мой код ниже

vegetarianCoder 28.06.2019 09:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
47
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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("ImageNam‌​e_13")).where(size("‌​ImageName_13")> 1)

vegetarianCoder 28.06.2019 09:55

@SahilNagpal, что то же самое, не так ли?

Steven 28.06.2019 09:58

проблема, с которой я столкнулся, заключается в том, что я не могу записать свой фрейм данных в csv или текст, потому что фрейм данных не поддерживает тип данных set или list (Array) для csv или text.

vegetarianCoder 28.06.2019 10:00

Я запускаю это: dup_df = data.groupBy('lon_13','lat_13').agg(collect_set("ImageName_1‌​3").alias("ImageName‌​_13")).where(size("I‌​mageName_13" )>1) newdup = dup_df.withColumn("ImageName_13",concat_ws(", ""ImageName_13")) newdup.show(20,False) У меня пустой столбец изображения

vegetarianCoder 28.06.2019 10:51

join_udf = udf(lambda x: ",".join(x)) df.withColumn("test_123", join_udf(col("test_123"))).show() это то, что я пробовал

vegetarianCoder 28.06.2019 11:04

@SahilNagpal udf влияет на ваши выступления. Лучше использовать встроенные функции.

Steven 28.06.2019 14:08

Другие вопросы по теме