假设我使用以下内容将HDFS中的平面文件导入spark:
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列呢? scala中有没有办法使用某种通配符来说明
val dataToTuple = data.map{ case Array(x,y, ... ) => (x,y, ...) }
无需写出100个变量来匹配?
我尝试过像
这样的事情val dataToTuple = data.map{ case Array(_) => (_) }
但这似乎没有多大意义。
答案 0 :(得分:1)
如果您的数据列是同质的(如Array
的{{1}}) - 元组可能不是提高类型安全性的最佳解决方案。您所能做的就是使用Shapeless库中的大小列表来修复数组的大小:
How to require typesafe constant-size array in scala?
如果您的专栏未命名,这是一种正确的方法。例如,您的行可能是欧几里德空间中向量的表示。
否则(命名列,可能是不同的类型),最好使用案例类对其进行建模,但要注意size restriction。这可以帮助您快速将数组(或其部分)映射到ADT:https://stackoverflow.com/a/19901310/1809978