Функция, не возвращающая DataFrame pyspark

Я определил функцию, которая возвращает фрейм данных пересечения всех кадров данных, заданных в качестве входных данных. Однако, когда я сохраняю вывод функции в какой-либо переменной, он не будет сохранен в переменной. Он отображается как нетиповый объект

def intersection(list1, intersection_df,i):
    if (i == 1):
        intersection_df = list1[0]
        print(type(intersection_df))
        intersection(list1, intersection_df, i+1)
    elif (i>len(list1)):
        print(type(intersection_df))
        a = spark.createDataFrame(intersection_df.rdd)
        a.show()
        return a
    else:
        intersection_df = intersection_df.alias('intersection_df')
        tb = list1[i-1]
        tb = tb.alias('tb')
        intersection_df = intersection_df.join(tb, intersection_df['value'] == tb['value']).where(col('tb.value').isNotNull()).select(['intersection_df.value'])
        print(type(intersection_df))
        intersection(list1, intersection_df, i+1)

например, если я даю ввод следующим образом,

list1 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
list2 = [3,4,5,6,7,8,9,10,11,12,13,14,15,16]
list3 = [6,7,8,9,10,11,12,13,4,16,343]
df1 = spark.createDataFrame(list1, StringType())
df2 = spark.createDataFrame(list2, StringType())
df3 = spark.createDataFrame(list3, StringType())
list4 = [df1,df2,df3]
empty_df = []
intersection_df = intersection(list4, empty_df, 1)

Я ожидаю, что следующий вывод будет сохранен в interesection_df

 +-----+
 |value|
 +-----+
 | 7   |
 | 11  |
 | 8   |
 | 6   |
 | 9   |
 | 10  |
 | 4   |
 | 12  |
 | 13  |
 +-----+
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы попали под проклятие рекурсии.

Проблема:
Вы вызываете intersection рекурсивно, но возвращаетесь только в одном из условий if. Поэтому, когда он возвращает ваш df, ему некуда идти (напомним: каждый вызов функции создает стек).

Решение:
возвращаться, когда вы вызываете intersection из вашего if и else состояния. например return intersection(list1, intersection_df, i+1) в вашем if состоянии.

Другие вопросы по теме