2017-03-01 63 views
1

我打算从数组创建数据框 - 将数组的元素顺序分配到多个列。将数组的元素重新分配到数据框中的多列

例如:

var A = Array(1,2,4,21,2,4,34,2,24,2,4,24,5,8,4,2,1,1) 
var B = sc.parallelize(A.grouped(3).toList).map(Tuple1(_)).toDF("values") 

|  values| 
+-----------+ 
| [1, 2, 4]| 
| [21, 2, 4]| 
|[34, 2, 24]| 
| [2, 4, 24]| 
| [5, 8, 4]| 
| [2, 1, 1]| 
+-----------+ 

上述结果,但我需要在3组不同的列这3个要素。

请建议一个解决方案,不要硬编码3个元素。

回答

1

基本问题是你正在创建Tuple1这是一个单一的元素。如果你使用ax => Tuple3(x(0),x(1),x(2)),它将解决它的情况下为3.

如果你不想硬编码,你可以做一些事情像这样:

def addColumns(num: Int, origDF: DataFrame) { 
    var df = origDF 
    for { 
     x <- 0 to num 
    } { 
     df = df.withColumn(s"col_$x", udf((y: Seq[Int]) => y(x))($"values")) 
    } 
    df 
} 

这将提取相关列(您可能还想删除原始值)。

相关问题