Как разрешить повторяющиеся имена столбцов при объединении двух фреймов данных в PySpark?

Чтобы добавить к принятому ответу:

Помните, что иногда 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

0
задан Aviral Srivastava 12 March 2019 в 05:02
поделиться

2 ответа

Здесь нет ярлыка. 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')
0
ответ дан Greg 12 March 2019 в 05:02
поделиться

Я сделал что-то подобное, но в 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"))
    
  • [ 119]
0
ответ дан Prasad Khode 12 March 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: