PySpark: как обрабатывать каждую строку фрейма данных

#apache-spark #pyspark #apache-spark-sql

#apache-spark #pyspark #apache-spark-sql

Вопрос:

Я хочу обработать каждую строку фрейма данных. Здесь столбец feat содержит много элементов с форматом idx:value . Я хочу сохранить idx то, что мне нужно.

Например, я хочу сохранить idx=1 или idx=5 .

 df = spark.createDataFrame([("u1","1:a 2:k 5:c 6:i"),("u2","2:k 4:p 5:b 6:k")],["id","feat"])
  

Input:

  --- --------------- 
| id|           feat|
 --- --------------- 
| u1|1:a 2:k 5:c 6:i|
| u2|2:k 4:p 5:b 6:k|
 --- --------------- 
  

Expected :

  --- --------------- 
| id|           feat|
 --- --------------- 
| u1|1:a 5:c        |
| u2|5:b            |
 --- --------------- 
  

Комментарии:

1. Это просто строка? очень жаль.

Ответ №1:

Вот моя попытка с несколькими функциями.

 df = spark.createDataFrame([("u1","1:a 2:k 5:c 6:i"),("u2","2:k 4:p 5:b 6:k")],["id","feat"])

select_idx=[1,5]

df.withColumn('feat', f.explode(f.split('feat', ' '))) 
  .withColumn('feat', f.split('feat', ':')) 
  .filter(f.col('feat')[0].isin(select_idx)) 
  .withColumn('feat', f.concat_ws(':', 'feat')) 
  .groupBy('id').agg(f.collect_list('feat').alias('feat')) 
  .withColumn('feat', f.concat_ws(' ', 'feat')) 
  .show(10, False)

 --- ------- 
|id |feat   |
 --- ------- 
|u1 |1:a 5:c|
|u2 |5:b    |
 --- ------- 
  

Комментарии:

1. Что, если я определю переменную для выражения (1,5) ? Как добиться этого таким образом, select_idx=[1,5], df.filter(df.feat[0].isin(select_idx)) ?