Чтобы добавить к принятому ответу:
Помните, что иногда set -e
недостаточно, особенно если у вас есть трубы.
Например, предположим, что у вас есть этот скрипт
#!/bin/bash
set -e
./configure > configure.log
make
... который работает так, как ожидалось: ошибка в configure
прерывает выполнение.
Завтра вы делаете кажущееся тривиальное изменение:
#!/bin/bash
set -e
./configure | tee configure.log
make
... и теперь это не работает. Это объясняется здесь здесь , и предусмотрено обходное решение (только Bash):
#!/bin/bash set -e set -o pipefail ./configure | tee configure.log make
Здесь нет ярлыка. Pyspark ожидает, что левый и правый кадры данных будут иметь разные наборы имен полей (за исключением ключа соединения).
Одним из решений было бы префикс каждого имени поля с помощью «left_» или «right_» следующим образом:
# Obtain columns lists
left_cols = df.columns
right_cols = df2.columns
# Prefix each dataframe's field with "left_" or "right_"
df = df.selectExpr([col + ' as left_' + col for col in left_cols])
df2 = df2.selectExpr([col + ' as right_' + col for col in right_cols])
# Perform join
df3 = df.alias('l').join(df2.alias('r'), on='c_0')
Я сделал что-то подобное, но в Scala , вы можете конвертировать то же самое в pyspark ...
Переименуйте имена столбцов в каждом кадре данных
dataFrame1.columns.foreach(columnName => {
dataFrame1 = dataFrame1.select(dataFrame1.columns.head, dataFrame1.columns.tail: _*).withColumnRenamed(columnName, s"left_$columnName")
})
dataFrame1.columns.foreach(columnName => {
dataFrame2 = dataFrame2.select(dataFrame2.columns.head, dataFrame2.columns.tail: _*).withColumnRenamed(columnName, s"right_$columnName")
})
Теперь join
, упомянув имена столбцов
resultDF = dataframe1.join(dataframe2, dataframe1("left_c_0") === dataframe2("right_c_0"))