我有一个scala程序,该程序具有一个数据框,并使用此语句将其转换为列表。
示例df
:
df = spark_session.createDataFrame([
("key", "a,b,c")
]
val list=df.rdd.map(r=>r.getString(0)).collect.toList.flatMap(_.split(",")).filter(p=> !p.contains(primaryKey))
我需要在PySpark
中写类似的语句,但是r=>r.getString(0)
在PySpark
中不起作用。我怎样才能做到这一点?
答案 0 :(得分:2)
在scala中,r => r.getString
是一个匿名函数,也称为lambda函数。代码的一个问题是您使用的是Scala的lambda语法,而不是python的。假设lambda r: r.getString(0)
具有r
方法,则python中的等效lambda为:.getString
。
类似地,在scala _.
中是lambda的简写形式,在这里您只使用一次变量,但它等同于上述r=>r.
这种样式。据我所知,Python没有这种简写形式,因此您将只使用上面的常规lambda。
python中的代码大致为:
result_lst = df.rdd.map(lambda r: r.getString(0)).collect.toList.flatMap(lambda x: x.split(",")).filter(lambda p: not p.contains(primaryKey))
答案 1 :(得分:1)
以下是Scala代码的Python版本,进行了一些更改:
split
collect
在最后执行以利用PySpark的flatMap
df = spark.createDataFrame([
("key1", "aa,bb,cc"),
("key2", "ii,jj,kk")
]).toDF("key", "value")
df.show()
+----+--------+
| key| value|
+----+--------+
|key1|aa,bb,cc|
|key2|ii,jj,kk|
+----+--------+
primaryKey = "k"
resultRDD = df.rdd.map(lambda r: r[1]).flatMap(lambda v: v.split(",")).filter(lambda p: not primaryKey in p)
resultRDD.collect()
['aa', 'bb', 'cc', 'ii', 'jj']