Pyspark, как преобразовать необработанные данные в формат SVMlight

#dataframe #pyspark #format #bigdata #rdd

Вопрос:

У меня есть один вопрос относительно карты Писпарка.

Например, у меня есть следующие данные:

  data=[(1,1,1,10),(1,1,2,20),(2,1,3,15),(2,1,1,47),(3,0,2,28),(3,0,3,17)]
 df=spark.createDataFrame(data).toDF("ID","Target","features","value1")
 df.show()

  --- ------ -------- ------ 
 | ID|Target|features|value1|
  --- ------ -------- ------ 
 |  1|     1|       1|    10|
 |  1|     1|       2|    20|
 |  2|     1|       3|    15|
 |  2|     0|       1|    47|
 |  3|     0|       2|    28|
 |  3|     0|       3|    17|
  --- ------ -------- ------ 
 

Я хочу преобразовать данные в следующий вид: группа по идентификатору:

  1 1:10  2:20
 1 2:15  1:47
 0 2:28  3:17
 

Таким образом, каждая строка представляет идентификатор, а первое значение представляет цель и функции:значение1

Не могли бы вы предоставить какой-либо пример кода или предложения?

Большое вам спасибо!!!!!!!!!!!

Ответ №1:

Вы можете сгруппировать данные по ID (а может быть, и по Target ?), собрать каждую группу в список, а затем использовать комбинацию transform и concat_ws для форматирования каждого списка в требуемый формат:

 from pyspark.sql import functions as F

df = spark.createDataFrame(data).toDF("ID","Target","features","value1") 
    .groupBy("ID", "Target").agg(F.collect_list(F.struct("features", "value1")).alias("feature_value")) 
    .withColumn("feature_value", F.expr("transform(feature_value, x -> concat_ws(':',x.features, x.value1))")) 
    .withColumn("feature_value", F.concat_ws(" ", F.col("feature_value"))) 
    .withColumn("result", F.concat_ws(" ", F.col("Target"), F.col("feature_value"))) 
    .select("result")
 

Результат:

  ----------- 
|     result|
 ----------- 
|0 2:28 3:17|
|1 1:10 2:20|
|1 3:15 1:47|
 -----------