2016-03-07 23 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