2015-11-19 21 views
5

Ho un file csv da 10 GB in cluster hadoop con colonne duplicate. Ho cercare di analizzare in SparkR in modo da uso spark-csv pacchetto per analizzare come DataFrame:Colonne duplicate in Spark Dataframe

df <- read.df(
    sqlContext, 
    FILE_PATH, 
    source = "com.databricks.spark.csv", 
    header = "true", 
    mode = "DROPMALFORMED" 
) 

Ma poiché df avere duplicati Email colonne, se voglio selezionare questa colonna, sarebbe errore fuori:

select(df, 'Email') 

15/11/19 15:41:58 ERROR RBackendHandler: select on 1422 failed 
Error in invokeJava(isStatic = FALSE, objId$id, methodName, ...) : 
    org.apache.spark.sql.AnalysisException: Reference 'Email' is ambiguous, could be: Email#350, Email#361.; 
    at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolve(LogicalPlan.scala:278) 
... 

Voglio mantenere la prima occorrenza della colonna Email ed eliminare quest'ultima, come posso fare?

risposta

4

Il modo migliore sarebbe quello di cambiare il nome della colonna monte;)

Tuttavia, sembra che non è possibile, quindi ci sono un paio di opzioni:

  1. Se il caso delle colonne sono diverse ("e-mail" vs "Email") è possibile attivare maiuscole e minuscole:

     sql(sqlContext, "set spark.sql.caseSensitive=true") 
    
  2. Se i nomi di colonna sono esattamente gli stessi, è necessario manualmente specificare lo schema e saltare la prima fila per evitare le intestazioni:

    customSchema <- structType(
    structField("year", "integer"), 
    structField("make", "string"), 
    structField("model", "string"), 
    structField("comment", "string"), 
    structField("blank", "string")) 
    
    df <- read.df(sqlContext, "cars.csv", source = "com.databricks.spark.csv", header="true", schema = customSchema) 
    
1

Provare a rinominare la colonna.

È possibile selezionarlo in base alla posizione anziché alla chiamata select.

colnames(df)[column number of interest] <- 'deleteme' 

In alternativa si può solo eliminare la colonna direttamente

newdf <- df[,-x] 

dove x è il numero di colonna non si desidera.

Aggiornamento:

Se quanto sopra non funzionano, è possibile impostare intestazione su false e quindi utilizzare la prima fila per rinominare le colonne:

df <- read.df(
    sqlContext, 
    FILE_PATH, 
    source = "com.databricks.spark.csv", 
    header = "FALSE", 
    mode = "DROPMALFORMED" 
) 

#get first row to use as column names 
mycolnames <- df[1,] 

#edit the dup column *in situ* 
mycolnames[x] <- 'IamNotADup' 
colnames(df) <- df[1,] 

# drop the first row: 
df <- df[-1,] 
+0

ho provato entrambi, ma tutti portano allo stesso "di riferimento 'e-mail' è ambiguo" l'errore che ho citato nella domanda. – Bamqf

Problemi correlati