2015-11-19 146 views
5

我在hadoop集羣中有一個10GB的csv文件,並且有重複的列。我嘗試分析它SparkR所以我用spark-csv包解析它作爲DataFrameSpark Dataframe中的重複列

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

但由於DF有重複Email列,如果我要選擇此列,它會報錯了:

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) 
... 

我想保留Email列的第一次出現並刪除後者,我該怎麼做?

回答

4

,最好的辦法是改變列名的上游;)

然而,似乎是不可能的,所以有幾個選項:

  1. 如果列的情況是不同的(「電子郵件」與「電子郵件」),你可以打開大小寫:

     sql(sqlContext, "set spark.sql.caseSensitive=true") 
    
  2. 如果列名是完全一樣的,你需要手動指定模式和跳過第一行,以避免頭:

    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

嘗試重命名該列。

您可以按位置而不是select調用來選擇它。

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

或者你可以只放置列直接

newdf <- df[,-x] 

其中x是你不想要的列數。

更新:

如果以上不工作,你可以設置標題爲false,然後使用第一行重新命名列:

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

我都嘗試,但他們都得出了相同的「參考‘電子郵件’不明確」的錯誤,我在問題中提到。 – Bamqf