Spark数据框中的重复列

11

我在Hadoop集群中有一个大小为10GB的CSV文件,其中包含重复列。我尝试在SparkR中分析它,所以我使用spark-csv软件包将其解析为DataFrame

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

但是由于 df 中存在重复的 Email 列,如果我想选择该列,它会出错:

但是由于 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个回答

15

最好的方法是在上游更改列名称;)

但是,看起来这是不可能的,所以有几个选项:

  1. If the case of the columns are different("email" vs "Email") you can turn on case sensitivity:

         sql(sqlContext, "set spark.sql.caseSensitive=true")
    
  2. If the column names are exactly the same, you will need to manually specify the schema and skip the first row to avoid the headers:

    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)
    

4

当您开始一个Spark会话时,您可以添加一条简单的配置行。创建成功的Spark会话之后,请添加此行以设置Spark配置...

spark.conf.set("spark.sql.caseSensitive", "true")

1
尝试重命名该列。 您可以通过位置选择它,而不是使用“select”调用。
colnames(df)[column number of interest] <- 'deleteme'

或者你可以直接删除该列。

 newdf <- df[,-x]

当x为你不想要的列数。

更新:

如果上述方法不起作用,你可以将header设置为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,]

我尝试了两种方法,但它们都导致了我在问题中提到的相同的“引用'Email'不明确”的错误。 - Bamqf

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接