Pyspark map (переупорядочить / переименовать) столбцы с использованием шаблона JSON - PullRequest
0 голосов
/ 09 января 2020

Я задал следующий вопрос здесь:

Со следующим текстом:

У меня есть такой фрейм данных:

|customer_key|order_id|subtotal|address        |
------------------------------------------------
|12345       |O12356  |123.45  |123 Road Street|
|10986       |945764  |70.00   |634 Road Street|
|32576       |678366  |29.95   |369 Road Street|
|67896       |198266  |837.69  |785 Road Street|

И я хотел бы переупорядочить / переименовать столбцы на основе следующего JSON, который содержит текущее имя столбца и желаемое имя столбца:

{
"customer_key": "cust_id",
"order_id": "transaction_id",
"address": "shipping_address",
"subtotal": "subtotal"
}

, чтобы получить результирующий кадр данных:

|cust_id|transaction_id|shipping_address|subtotal|
--------------------------------------------------
|12345  |O12356        |123 Road Street |123.45  |
|10986  |945764        |634 Road Street |70.00   |
|32576  |678366        |369 Road Street |29.95   |
|67896  |198266        |785 Road Street |837.69  |

это возможно? если это облегчает, порядок столбцов не критичен.

Ключевое отличие состоит в том, что я сейчас ищу способ сделать это в pyspark вместо pandas.

Ответы [ 2 ]

2 голосов
/ 10 января 2020

Используйте выбор с псевдонимами:

select_expr = [col(c).alias(a) for c, a in mappings.items()]

df = df.select(*select_expr)
1 голос
/ 10 января 2020

Вы можете просто использовать следующее:

new_mapping = {
"customer_key": "cust_id",
"order_id": "transaction_id",
"address": "shipping_address",
"subtotal": "subtotal"
}

for key, value in new_mapping.items():
        df = df.withColumnRenamed(key, value)

# Re-order df
new_columns = [col_name for col_name in new_mapping.values()]
df = df.select(*new_columns)

Примечание : теперь порядок зависит от словаря. В Python 2 дикторы неупорядочены, поэтому вы должны использовать OrderedDict, в Python 3 дикторы имеют порядок и сохраняют порядок вставки.

...