sparkDataframe中的重复列

qzwqbdag  于 2021-06-03  发布在  Hadoop
关注(0)|答案(3)|浏览(472)

我在hadoop集群中有一个10gb的csv文件,有重复的列。我试着用sparkr分析它,所以我用 spark-csv 将其解析为 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 列并删除后者,我该怎么做呢?

3pmvbmvn

3pmvbmvn1#

您还可以使用 toDF .
对于pyspark来说,也是这样:从sparkDataframe中选择或删除重复的列

cnwbcb6i

cnwbcb6i2#

最好的方法是在上游更改列名;)
但是,这似乎是不可能的,因此有两种选择:
如果列的大小写不同(“email”与“email”),可以启用区分大小写:

sql(sqlContext, "set spark.sql.caseSensitive=true")

如果列名完全相同,则需要手动指定架构并跳过第一行以避免出现标题:

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

lsmepo6l3#

尝试重命名列。
您可以按位置而不是 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,]

相关问题