#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|
-----------