2016-03-07 65 views
0

我正在处理一个问题,我需要加载大量的CSV并使用SparkR对它们进行聚合。在SparkR中处理复制的列

  • 我需要推断架构,只要我可以(所以检测整数等)。
  • 我需要假设我无法对模式进行硬编码(每个文件中未知数的 列或无法单独从列名称推断模式)。
  • 我无法从具有重复标题值的CSV文件推断模式 - 它根本不会让您。

我加载它们,像这样:

df1 <- read.df(sqlContext, file, "com.databricks.spark.csv", header = "true", delimiter = ",") 

它加载好了,但是当我尝试运行任何类型的工作(即使是简单的count())失败:

java.lang.IllegalArgumentException: The header contains a duplicate entry: # etc 

我试图用重命名的标题中出现的模式:

new <- make.unique(c(names(df1)), sep = "_") 
names(df1) <- new 
schema(df1) # new column names present in schema 

但是,当我再次尝试count(),我得到和以前一样的重复错误,这表明它引用了旧的列名称。

我觉得有一个非常简单的方法,如果有事先道歉。有什么建议么?

+0

你可能会得到同样的错误重复以前一样,因为你之前.Count之间没有发生作用(),这样的数据甚至没有被加载到数据帧在此之前,即使你已经改变的模式。您是否可以选择从csv中删除标题行,还是将其注释掉? (您可以将csv阅读器设置为忽略注释行)。然后在读入文件时使用inferSchema =“true”。 – xyzzy

回答

0

spark csv包似乎目前没有办法按索引跳过行,如果你不使用header =“true”,那么带有dupes的标题就会成为第一行,这样会混乱与您的模式推断。如果你碰巧知道你的头文字是以什么开头的,并且知道没有其他行会以此开头,那么你可以将它放入注释字符设置中,并且该行将被跳过。例如。

df <- read.df(sqlContext, "cars.csv", "com.databricks.spark.csv",header="false", comment="y",delimiter=",",nullValue="NA",mode="DROPMALFORMED",inferSchema="true"‌​) 
+0

这就是我想要避免的。我试图创建一个解决方案,尽可能不依赖于对文件进行更改,但是没有选择按索引跳过似乎相当困难的选项。 –

+0

可能要考虑分支spark-csv库并在CsvRelation.scala中编写一个方法来不使用头部,而是跳过头部行? https://github.com/databricks/spark-csv – xyzzy