我正在使用一个 pyspark 数据框,它是:
+----+----+---+---+---+----+
| a| b| c| d| e| f|
+----+----+---+---+---+----+
| 2|12.3| 5|5.6| 6|44.7|
|null|null| 9|9.3| 19|23.5|
| 8| 4.3| 7|0.5| 21| 8.2|
| 9| 3.8| 3|6.5| 45| 4.9|
| 3| 8.7| 2|2.8| 32| 2.9|
+----+----+---+---+---+----+
要创建上述数据框:
rdd = sc.parallelize([(2,12.3,5,5.6,6,44.7),
(None,None,9,9.3,19,23.5),
(8,4.3,7,0.5,21,8.2),
(9,3.8,3,6.5,45,4.9),
(3,8.7,2,2.8,32,2.9)])
df = sqlContext.createDataFrame(rdd, ('a', 'b','c','d','e','f'))
df.show()
我想创建另一列“g”,其值是基于现有非空列的元组列表。元组列表的形式为:
((a栏,b栏),(c栏,d栏),(e栏,f栏))
输出 col 的要求: 1)在创建元组列表时只考虑非空列。2) 返回元组列表。
因此,带有“g”列的最终数据框将是:
+---+----+---+---+---+----+--------------------------+
| a| b| c| d| e| f| g |
+---+----+---+---+---+----+--------------------------+
| 2|12.3| 5|5.6| 6|44.7|[[2,12.3],[5,5.6],[6,44.7]|
|nul|nul| 9 |9.3| 19|23.5|[[9,9.3],[19,23.5] |
| 8| 4.3| 7|0.5| 21| 8.2|[[8,4.3],[7,0.5],[21,8.2] |
| 9| 3.8| 3|6.5| 45| 4.9|[[9,3.8],[3,6.5],[45,4.9] |
| 3| 8.7| 2|2.8| 32| 2.9|[[3,8.7],[2,2.8],[32,2.9] |
+---+----+---+---+---+----+--------------------------+
在“g”列中,第二行元组只有两对而不是三对,因为对于第二行,我们省略了列“a”和“b”值,因为它们是空值。
我不确定如何动态省略列中的空值并形成元组列表
我试图通过 udf 部分实现最后一列:
l1=['a','c','e']
l2=['b','d','f']
def func1(r1,r2):
l=[]
for i in range(len(l1)):
l.append((r1[i],r2[i]))
return l
func1_udf=udf(func1)
df=df.withColumn('g',func1_udf(array(l1),array(l2)))
df.show()
我尝试将 udf 声明为 ArrayType,但它不起作用。任何帮助将非常感激。我正在使用 pyspark 1.6。谢谢!