Кадр данных Spark отличает столбцы с дублированным именем

Так как я знаю в Кадре данных Spark, который для нескольких столбцов может иметь то же имя как показано в ниже снимка кадра данных:

[
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0})),
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=125231, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0047, 3: 0.0, 4: 0.0043})),
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=145831, f=SparseVector(5, {0: 0.0, 1: 0.2356, 2: 0.0036, 3: 0.0, 4: 0.4132})),
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=147031, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0})),
Row(a=107831, f=SparseVector(5, {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}), a=149231, f=SparseVector(5, {0: 0.0, 1: 0.0032, 2: 0.2451, 3: 0.0, 4: 0.0042}))
]

Выше результата создается соединением с кадром данных к себе, Вы видите, что существует 4 столбцы с оба два a и f.

Проблема, там, когда я пытаюсь сделать больше вычисления с a столбец, я не могу найти способ выбрать a, У меня есть попытка df[0] и df.select('a'), оба возвратили меня ниже ошибки mesaage:

AnalysisException: Reference 'a' is ambiguous, could be: a#1333L, a#1335L.

Есть ли так или иначе в Spark API, что я могу отличить столбцы от дублированных имен снова? или возможно некоторый способ позволить мне изменить имена столбцов?

57
задан 5 January 2019 в 19:00

2 ответа

Это не могло бы быть лучшим подходом, но если Вы хотите переименовать дублирующиеся столбцы (после того, как соединение), можно сделать настолько использующий эту крошечную функцию.

def rename_duplicate_columns(dataframe):
    columns = dataframe.columns
    duplicate_column_indices = list(set([columns.index(col) for col in columns if columns.count(col) == 2]))
    for index in duplicate_column_indices:
        columns[index] = columns[index]+'2'
    dataframe = dataframe.toDF(*columns)
    return dataframe
0
ответ дан 1 November 2019 в 15:46

Если у Вас есть более сложный вариант использования, чем описанный в ответе Glennie Helles Sindholt, например, у Вас есть другие/небольшие количества имена необъединяющего столбца, которые являются также тем же и хотят отличить их, в то время как выбор лучше использовать псевдонимы, например:

df3 = df1.select("a", "b").alias("left")\
   .join(df2.select("a", "b").alias("right"), ["a"])\
   .select("left.a", "left.b", "right.b")

df3.columns
['a', 'b', 'b']
0
ответ дан 1 November 2019 в 15:46

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

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