Reshuffle Schema Columns in Spark DataFrame

If you need to change order of columns inside a DataFrame here’s a solution:

 1def move_col_after(df: DataFrame, col_to_move: str, col_after: str) -> DataFrame:
 2    """Moves a column to appear after specified column in a dataframe
 3
 4    :param df: Dataframe to work with
 5    :param col_to_move: column that is to be moved
 6    :param col_after: column to move after
 7    :return:
 8    """
 9    ordered_cols = []
10    moved = False
11    for fld in df.schema.fieldNames():
12
13        if fld != col_to_move:
14            ordered_cols.append(fld)
15
16        if fld == col_after:
17            ordered_cols.append(col_to_move)
18            moved = True
19
20    # in case the column wasn't found, don't lose the data
21    if not moved:
22        ordered_cols.append(col_to_move)
23
24    return df.select(*ordered_cols)
25
26
27def move_cols_after(df: DataFrame, col_after: str, *cols_to_move) -> DataFrame:
28    """Moves a column to appear after specified column in a dataframe
29
30    :param df: Dataframe to work with
31    :param col_after: column to move after
32    :param cols_to_move: columns to be moved
33    :return:
34    """
35
36    if not cols_to_move:
37        return df
38
39    ordered_cols = []
40    for fld in df.schema.fieldNames():
41
42        if fld not in cols_to_move:
43            ordered_cols.append(fld)
44
45        if fld == col_after:
46            ordered_cols.extend(cols_to_move)
47    return df.select(*ordered_cols)
48
49
50def move_col_to_position(df: DataFrame, col_name: str, pos: int) -> DataFrame:
51    rc = []
52    for i in range(0, len(df.columns)):
53        if i == pos:
54            rc.append(col_name)
55
56        col = df.columns[i]
57        if col != col_name:
58            rc.append(col)
59
60    return df.select(*rc)

The usage is self-explanatory.

Have feedback or questions? Feel free to email me.