2012-05-14 62 views
2

我想讀取一個相當大的csv文件並對其進行處理(切片,骰子,總結等)interactively(數據瀏覽)。我的想法是文件讀入到一個數據庫(H2),並使用SQL來處理它:在Scala中動態生成案例類

  1. 讀取文件:我用Ostermiller csv parser

  2. 確定每個列的類型:我隨機選擇50行和派生每列的類型(int,long,double,date,string)

  3. 我想用Squeryl來處理。爲此,我需要動態創建一個案例類。這是迄今爲止的瓶頸!

  4. 我將文件上傳到H2並使用任何SQL命令。

我的問題:

  • 有Scala中這樣做的更好的通用交互的方式?
  • 有沒有辦法解決第三點?用不同的方式說明,給定一個類型列表(對應於csv文件中的列),是否可以動態創建一個與Squeryl中的表相對應的case類?根據我的理解,我可以使用宏來做到這一點,但我沒有足夠的經驗來做到這一點。
+0

你有沒有想過使用比斯卡拉別的東西?像[Gnu R](http://www.r-project.org/)? – ziggystar

+0

@ziggystar我廣泛使用R作爲我的日常工作。它在R中是可以實現的!我試圖探索scala進行數據分析...... – teucer

+0

下面是一個高度相關的問題,其答案很充實:[用宏動態創建案例類](http:// stackoverflow。com/questions/22850340 /動態創建案例類與宏) –

回答

2

由於scala是一種靜態類型的語言,除了反射之外,沒有辦法動態創建類,這是慢和危險的,因此應該避免。即使使用宏,你也無法做到這一點。宏在編譯時進行評估,而不是在運行時進行評估,因此您需要在編譯時瞭解數據的結構。如果你甚至不知道你的數據是什麼樣的,你需要什麼樣的課程類?你期望從Map[String,Any]得到什麼好處?

+0

內存(該文件可能非常大),性能(?),利用SQL知識等。 – teucer

3

我認爲你對第一個問題的態度聽起來很合理。

關於你的第二個問題 - 作爲drexin的答案的補充 - 可以生成字節碼,並使用庫(如ASM)。有了這樣一個庫,您可以生成與案例類相同的字節碼。

1

我想你想創建一個封閉的基類,然後創建一系列的case類作爲它的子類。每個子類將包裝您支持的不同類型。

然後,您可以使用匹配語句和解構來處理各個類型,並通過基類在一些不重要的地方對它們進行一般處理。

由於在編譯時對其不夠了解,所以無法爲整行創建類。即使你可以動態生成一個類(也許通過在運行時調用編譯器),你將無法從類型安全中受益,而且大部分代碼都必須將其一般地處理。