#python #apache-spark #pyspark
#python #apache-spark #pyspark
Вопрос:
У меня есть RDD в виде:
[(('1', '10'), 1), (('10', '1'), 1), (('1', '12'), 1), (('12', '1'), 1)]
Что я сделал, так это
df = spark.createDataFrame(rdd, ["src", "rp"])
где я создаю столбец из кортежа и int, который выглядит следующим образом:
------- -----
| src|rp |
------- -----
|[1, 10]| 1|
|[10, 1]| 1|
|[1, 12]| 1|
|[12, 1]| 1|
------- -----
Но я не могу понять, как создать столбец src первого элемента в [x, y] и столбец dst второго элемента, поэтому у меня был бы фрейм данных с тремя столбцами src, dst и rp:
------- ----- -----
| src|dst |rp |
------- ----- -----
| 1| 10| 1|
| 10| 1| 1|
| 1| 12| 1|
| 12| 1| 1|
------- ----- -----
Ответ №1:
Вам нужно промежуточное преобразование в вашем RDD, чтобы сделать его плоским списком из трех элементов:
spark.createDataFrame(rdd.map(lambda l: [l[0][0], l[0][1], l[1]]), ["src", "dst", "rp"])
--- --- ---
|src|dst| rp|
--- --- ---
| 1| 10| 1|
| 10| 1| 1|
| 1| 12| 1|
| 12| 1| 1|
--- --- ---
Ответ №2:
Вы можете просто выполнить простой выбор в фрейме данных, чтобы отделить столбцы. Нет необходимости выполнять промежуточное преобразование, как предполагает другой ответ.
from pyspark.sql.functions import col
df = sqlContext.createDataFrame(rdd, ["src", "rp"])
df = df.select(col("src._1").alias("src"), col("src._2").alias("dst"),col("rp"))
df.show()
Вот результат
--- --- ---
|src|dst| rp|
--- --- ---
| 1| 10| 1|
| 10| 1| 1|
| 1| 12| 1|
| 12| 1| 1|
--- --- ---