Python для использования карты, как скала - PullRequest
0 голосов
/ 05 октября 2018

У меня есть программа 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 голосов
/ 06 октября 2018

Ниже приведена Python-версия кода Scala с парой изменений:

  1. 2-й элемент в ваших примерах данных извлекается, поскольку 1-й элемент не split -able
  2. collect выполняется в конце, чтобы использовать PySpark's 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']
0 голосов
/ 05 октября 2018

В scala r => r.getString - анонимная функция, также называемая лямбда-функцией.Одна проблема с вашим кодом заключается в том, что вы используете лямбда-синтаксис Scala, а не Python.Эквивалентная лямбда в python будет: lambda r: r.getString(0), при условии, что r имеет метод .getString.

Точно так же в scala _. является сокращением для лямбды, где вы используете переменную только один раз, но этоэквивалентен вышеуказанному стилю r=>r..Насколько мне известно, в Python такого сокращения нет, поэтому вы просто будете использовать обычную лямбду, как указано выше.

Код в 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))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...