我在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
列并删除后者,我该怎么做?
答案 0 :(得分:6)
最好的方法是更改上游的列名;)
然而,似乎这是不可能的,所以有几个选择:
如果列的大小写不同(“电子邮件”与“电子邮件”),则可以启用区分大小写:
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)
答案 1 :(得分: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,]
答案 2 :(得分:0)
您还可以使用"household": {
"enumeration_id": "1938347-32960066",
"location": "676 Derick Cape\nReeseburgh, WA 95751",
"identifier": "122 b 2",
"location_code": "LK-CMB-002",
"address": {
"text": "86242 Lynch Roads\nSouth Deon, KS 16600-5109",
"village": "address village",
"district": "address district"
},
创建一个新的数据框。
这是同一件事,对于pyspark:Selecting or removing duplicate columns from spark dataframe