2016-05-12 18 views
0

可以說,我是從HDFS使用類似下面的導入平面文件到火花:Array對元組與許多輸入變量星火

val data = sc.textFile("hdfs://name_of_file.tsv").map(_.split('\t')) 

這將產生一個Array[Array[String]]。如果我想要一個元組數組,我可以像這個solution中所引用的那樣進行操作,並將這些元素映射到一個元組中。

val dataToTuple = data.map{ case Array(x,y) => (x,y) } 

但是如果我的輸入數據有說100列?有沒有一種方式在斯卡拉使用某種通配符說

val dataToTuple = data.map{ case Array(x,y, ...) => (x,y, ...) } 

而不必寫出100個變量匹配?

我試着做一些像

val dataToTuple = data.map{ case Array(_) => (_) } 

但是這似乎並沒有太大的意義。

+0

爲什麼要使用一個包含100個元素的元組?只需使用'split'生成的數組? –

+0

如果你確實需要這個,你可以創建一個'Row'而不是'Tuple' –

+1

- 你可以使用Shapeless庫:http://stackoverflow.com/a/19901310/1809978但是請注意,元組的最大尺寸是有限的斯卡拉到22(我上次檢查它)+我相信,你仍然必須指定每列的類型。此外,它可能不是你實際需要的 – dk14

回答

1

如果您的數據列是同質的(如ArrayString s) - 元組可能不是提高類型安全性的最佳解決方案。所有你能做的就是利用無形庫大小的列表,以解決您的數組的大小:

How to require typesafe constant-size array in scala?

這是一個正確的做法,如果你列的是無名的。例如,您的行可能是歐幾里德空間中的矢量的表示。

否則(命名的列,也許是不同的類型),最好用案例類來建模,但要注意size restriction。這可能會幫助您快速將數組(或其部分)映射到ADT:https://stackoverflow.com/a/19901310/1809978