【问题标题】:Python to use map like scalaPython使用像scala这样的地图
【发布时间】:2018-10-08 19:52:14
【问题描述】:

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

【问题讨论】:

  • 你能提供一些示例数据吗?
  • 我添加了一些示例数据

标签: scala pyspark


【解决方案1】:

在 Scala 中,r => r.getString 是一个匿名函数,也称为 lambda 函数。您的代码的一个问题是您使用的是 Scala 的 lambda 语法而不是 python 的。 python 中的等效 lambda 为:lambda r: r.getString(0),假设 r 有一个 .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))

【讨论】:

  • 抱歉再次编辑问题,实际上我的完整陈述看起来像上面的scala
  • 我对 pthon 比较陌生,所以不知道如何解决这个问题
【解决方案2】:

以下是 Python 版本的 Scala 代码,其中包含一些更改:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-04-09
  • 2011-08-02
  • 2017-02-25
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多