Python使用像scala这样的地图

时间:2018-10-05 16:44:31

标签: scala pyspark

我有一个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中不起作用。我怎样才能做到这一点?

2 个答案:

答案 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版本,进行了一些更改:

  1. 检索示例数据中的第二个元素,因为第一个元素不能split
  2. 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']