Eu venho do fundo do pandas e estou acostumado a ler dados de arquivos CSV em um dataframe e depois simplesmente alterar os nomes das colunas para algo útil usando o comando simples:
df.columns = new_column_name_list
No entanto, o mesmo não funciona em quadros de dados pyspark criados usando o sqlContext. A única solução que eu poderia descobrir para fazer isso facilmente é a seguinte:
df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', inferschema='true', delimiter='\t').load("data.txt")
oldSchema = df.schema
for i,k in enumerate(oldSchema.fields):
k.name = new_column_name_list[i]
df = sqlContext.read.format("com.databricks.spark.csv").options(header='false', delimiter='\t').load("data.txt", schema=oldSchema)
Isso basicamente define a variável duas vezes e infere o esquema primeiro, depois renomeia os nomes das colunas e carrega o quadro de dados novamente com o esquema atualizado.
Existe uma maneira melhor e mais eficiente de fazer isso, como fazemos nos pandas?
Minha versão do Spark é 1.5.0
fonte
for
laço +withColumnRenamed
, mas a suareduce
opção é muito bom :)from functools import reduce
Vantagem de usar desta maneira: Com uma lista longa de colunas, você gostaria de alterar apenas alguns nomes de colunas. Isso pode ser muito conveniente nesses cenários. Muito útil ao unir tabelas com nomes de colunas duplicados.
fonte
Se você deseja alterar todos os nomes de colunas, tente
df.toDF(*cols)
fonte
df = df.toDF(*my_pandas_df.columns)
cols
sendo os novos nomes de coluna e apenas assumindo que a ordem dos nomescols
corresponde à ordem das colunas do quadro de dados?Caso você queira aplicar uma transformação simples em todos os nomes de colunas, este código faz o truque: (Estou substituindo todos os espaços por sublinhado)
Obrigado a @ user8117731 pelo
toDf
truque.fonte
Se você deseja renomear uma única coluna e manter o restante como está:
fonte
df.withColumnRenamed('age', 'age2')
fonte
withColumnRenamed
.esta é a abordagem que eu usei:
criar sessão pyspark:
criar quadro de dados:
veja df com nomes de colunas:
crie uma lista com novos nomes de coluna:
altere os nomes das colunas do df:
visualize o df com novos nomes de coluna:
fonte
Fiz uma função fácil de usar para renomear várias colunas para um dataframe pyspark, caso alguém queira usá-lo:
fonte
old_columns
seria o mesmo quedf.columns
.Outra maneira de renomear apenas uma coluna (usando
import pyspark.sql.functions as F
):fonte
Eu uso este:
fonte
Você pode usar a seguinte função para renomear todas as colunas do seu quadro de dados.
Caso você precise atualizar apenas os nomes de algumas colunas, você pode usar o mesmo nome na lista replace_with
Para renomear todas as colunas
Para renomear algumas colunas
fonte
Para uma única renomeação de coluna, você ainda pode usar toDF (). Por exemplo,
fonte
Podemos usar várias abordagens para renomear o nome da coluna.
Primeiro, vamos criar um DataFrame simples.
Agora vamos tentar renomear col_1 para col_3. PFB algumas abordagens para fazer o mesmo.
Aqui está a saída.
Eu espero que isso ajude.
fonte