PySpark - трансляция искровых данных - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь транслировать искровый фрейм данных, пробовал пару подходов, но не смог транслироватьЯ хочу зациклить все столбцы для некоторой обработки из другого фрейма данных, где в SchemaWithHeader colName Результат равен 1. Например, для столбцов требуется цикл - Имя, Возраст и Зарплата.

  • Подход 1
SchemaDFWithoutHeader = [('Name',1),('Age',1),('gender',0),('dept',0),("salary",1)]

rdd = spark.sparkContext.broadcast(SchemaDFWithoutHeader)
SchemaWithHeader = rdd.map(lambda x: Row(ColName=x[0], Result=bool(x[1])))

получение ошибки ниже

 SchemaWithHeader = rdd.map(lambda x: Row(ColName=x[0], Result=bool(x[1])))
AttributeError: 'Broadcast' object has no attribute 'map'

В кадре данных нет метода широковещательной передачи.Я не использую SQL-запрос для объединения двух фреймов данных, но использую некоторый цикл для доступа к SchemaWithHeader фрейму данных.

  • Подход 2
SchemaDFWithoutHeader = [('Name',1),('Age',1),('gender',0),('dept',0),("salary",1)]

rdd = spark.sparkContext.parallelize(SchemaDFWithoutHeader)
SchemaWithHeader = rdd.map(lambda x: Row(ColName=x[0], Result=bool(x[1])))

SchemaDF = spark.createDataFrame(SchemaWithHeader)
spark.sparkContext.broadcast(SchemaDF)
SchemaDF.registerTempTable("DFSchema")

получая ошибку ниже

py4j.Py4JException: Method __getstate__([]) does not exist

1 Ответ

0 голосов
/ 26 декабря 2018

Ошибка говорит само за себя ... В вашем коде ниже

rdd = spark.sparkContext.broadcast(SchemaDFWithoutHeader)

rdd - широковещательная переменная, для использования map на ней выполните rdd.value.Ниже приведен способ его использования.

SchemaWithHeader = rdd.value.map(lambda x: Row(ColName=x[0], Result=bool(x[1])))

Надеюсь, что это помогает ... Продолжайте делиться с сообществом:)

Редактировать 1: Поскольку вы передаете список, rdd.value даст вамсписок в качестве вывода.Список в Python не имеет функции карты.так что вы получаете ошибку, упомянутую в комментариях.Более того, если вы попытаетесь передать RDD, вы получите следующую ошибку: «Похоже, вы пытаетесь передать RDD или ссылаться на RDD из действия или преобразования. Преобразования и действия RDD могут вызываться только драйвером, а не внутри других».преобразований; "

По сути, вы не можете широковещательно передавать СДР, поскольку это уже распределенная структура данных и имеет разделы, и эти разделы уже установлены на нескольких машинах.

Примечание. Надеюсь, код, который вы написали, былпросто чтобы продемонстрировать проблему.Как я не мог понять ваш мыслительный процесс за этим.Тем не менее, ответ по-прежнему в силе.Я рекомендую вам понять концепцию широковещательных переменных, прежде чем внедрять в ваш проект.

Приветствия!

Harjeet

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