Spark - функция карты доступна для Dataframe или только для RDD? - PullRequest
0 голосов
/ 23 сентября 2019

Я только что понял, что могу сделать следующее в Scala

val df = spark.read.csv("test.csv")
val df1=df.map(x=>x(0).asInstanceOf[String].toLowerCase)

Однако в Python, если я попытаюсь вызвать функцию map для DataFrame, это вызовет ошибку.

df = spark.read.csv("Downloads/test1.csv")
df.map(lambda x: x[1].lower())

Ошибка

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/apache-spark/2.4.3/libexec/python/pyspark/sql/dataframe.py", line 1300, in __getattr__
    "'%s' object has no attribute '%s'" % (self.__class__.__name__, name))
AttributeError: 'DataFrame' object has no attribute 'map'

В Python Мне нужно явно преобразовать Dataframe в RDD.

У меня вопрос, почему, мне нужно сделать это в случае Python?

Это различие в реализации Spark API или Scala незаметно преобразует DataFrame в RDD назад и снова в DataFrame

1 Ответ

1 голос
/ 23 сентября 2019

Python Dataframe API не имеет функции отображения из-за того, как работает Python API.

Python, каждый раз, когда вы конвертируете в RDD или используете UDF с Python API, вы создаете вызов python во время вашегоказнь.

Что это значит?Это означает, что во время выполнения Spark вместо всех данных, обрабатываемых внутри JVM с генерируемым кодом Scala (API Dataframe), JVM должна вызвать код Python для применения созданной вами логики.Это по умолчанию создает ОГРОМНЫЕ издержки во время выполнения.

Таким образом, решение для Python - это создание API, который будет блокировать использование кода Python и будет использовать только сгенерированный Scala-код с использованием конвейера DataFrame.

Это поможет понять, как работают UDF с python, что в принципе очень близко к тому, как RDD-карты будут работать с Python: https://medium.com/wbaa/using-scala-udfs-in-pyspark-b70033dd69b9

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