2015-11-19 4 views
5

У меня есть файл csv размером 10 ГБ в кластере с плавающей точкой с дублирующимися столбцами. Я пытаюсь анализировать ее в SparkR поэтому я использую spark-csv пакет, чтобы разобрать его как DataFrame:Дублирующие столбцы в Spark Dataframe

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

Но поскольку ДФ имеет дублирующие 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. Если дело столбцов различны («электронная почта» против «Email») вы можете включить чувствительность к регистру:

     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] 

где х это номер столбца вы не хотите.

Update:

Если выше не работает, вы можете установить заголовок ложные, а затем использовать первую строку, чтобы переименовать столбцы:

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

Я попробовал оба, но все они ведут к тому же «Reference„Электронной почте“неоднозначные» ошибка я упомянул в этом вопросе. – Bamqf

Смежные вопросы