code: public Table rightOuter(Table table2, boolean allowDuplicateColumnNames, String... col2Names) {
          Table leftOuter = table2.join(col2Names).leftOuter(table, allowDuplicateColumnNames, columnNames);
  
          // reverse the columns
          Table result = Table.create(leftOuter.name());
          // loop on table that was originally first (left) and add the left-joined matching columns by name
          for (String name : table.columnNames()) {
              try {
                  result.addColumns(leftOuter.column(name));
              } catch (IllegalStateException e) {
                  // Can ignore this exception as it is anticipated.
                  // NOTE: DataFrameJoiner.rightOuter(): skipping left table's column,'"
                  //     +name+"', in favor of right table's matching column that was kept in join operation.");
              }
          }
          for (String name : table2.columnNames()) {
              if (!result.columnNames().stream().anyMatch(name::equalsIgnoreCase)) {
                  result.addColumns(leftOuter.column(name));
              }
          }
          return result;
      }
docs: Joins the joiner to the table2, using the given columns for the second table and returns the resulting table
  
  @param table2   The table to join with
  @param allowDuplicateColumnNames if {@code false} the join will fail if any columns other than the join column have the same name
  if {@code true} the join will succeed and duplicate columns are renamed
  @param col2Names The columns to join on. If a name refers to a double column, the join is performed after
  rounding to integers.
  @return The resulting table