PySpark создает фрейм данных с тремя столбцами из RDD с помощью tuple и int

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