如何在每个列中转换DataFrame以在pyspark中创建两个新列?

时间:2016-11-18 07:47:03

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我有一个数据帧“x”,其中有两列“x1”和“x2”

x1(status)    x2  
kv,true       45
bm,true       65
mp,true       75
kv,null       450
bm,null       550
mp,null       650

我想将此数据帧转换为根据其状态和值

过滤数据的格式
x1  true  null
kv   45    450
bm   65    550
mp   75    650

有没有办法做到这一点, 我正在使用pyspark datadrame

1 个答案:

答案 0 :(得分:2)

是的,有办法。首先使用split函数将第一列拆分为,,然后将此数据框拆分为两个数据框(使用where两次)并在第一列上简单地加入这些新数据框。

在Scala的Spark API中,它如下:

val x1status = Seq(
  ("kv,true",45),
  ("bm,true",65),
  ("mp,true",75),
  ("kv,null",450),
  ("bm,null",550),
  ("mp,null",650)).toDF("x1", "x2")

val x1 = x1status
  .withColumn("split", split('x1, ","))
  .withColumn("x1", 'split getItem 0)
  .withColumn("status", 'split getItem 1)
  .drop("split")

scala> x1.show
+---+---+------+
| x1| x2|status|
+---+---+------+
| kv| 45|  true|
| bm| 65|  true|
| mp| 75|  true|
| kv|450|  null|
| bm|550|  null|
| mp|650|  null|
+---+---+------+

val trueDF = x1.where('status === "true").withColumnRenamed("x2", "true")
val nullDF = x1.where('status === "null").withColumnRenamed("x2", "null")

val result = trueDF.join(nullDF, "x1").drop("status")

scala> result.show
+---+----+----+
| x1|true|null|
+---+----+----+
| kv|  45| 450|
| bm|  65| 550|
| mp|  75| 650|
+---+----+----+