使用许多输入变量的Spark中的元组到元组

时间:2016-05-12 19:39:39

标签: arrays scala apache-spark tuples

假设我使用以下内容将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(_) => (_) }

但这似乎没有多大意义。

1 个答案:

答案 0 :(得分:1)

如果您的数据列是同质的(如Array的{​​{1}}) - 元组可能不是提高类型安全性的最佳解决方案。您所能做的就是使用Shapeless库中的大小列表来修复数组的大小:

How to require typesafe constant-size array in scala?

如果您的专栏未命名,这是一种正确的方法。例如,您的行可能是欧几里德空间中向量的表示。

否则(命名列,可能是不同的类型),最好使用案例类对其进行建模,但要注意size restriction。这可以帮助您快速将数组(或其部分)映射到ADT:https://stackoverflow.com/a/19901310/1809978