spark Group By数据框架列,无聚合

时间:2018-06-24 00:00:34

标签: scala apache-spark

我在hdfs中有一个csv文件:/hdfs/test.csv,我想使用spark&scala对下面的数据进行分组,我需要这样的输出。

我想根据A1列对A1 ... AN列进行分组,输出应该是这样的

所有行应按以下方式分组。 输出:

    JACK , ABCD, ARRAY("0,1,0,1", "2,9,2,9") 
    JACK , LMN,  ARRAY("0,1,0,3", "0,4,3,T")
    JACK,  HBC,  ARRAY("1,T,5,21", "E7,4W,5,8)

输入:

    ++++++++++++++++++++++++++++++
     name   A1      A1  A2  A3..AN
   --------------------------------
    JACK    ABCD    0   1   0   1
    JACK    LMN     0   1   0   3
    JACK    ABCD    2   9   2   9
    JAC     HBC     1   T   5   21
    JACK    LMN     0   4   3   T
    JACK    HBC     E7  4W  5   8

我在spark scala中需要以下输出

   JACK , ABCD, ARRAY("0,1,0,1", "2,9,2,9")
   JACK , LMN,  ARRAY("0,1,0,3", "0,4,3,T")
   JACK,  HBC,  ARRAY("1,T,5,21", "E7,4W,5,8)

2 个答案:

答案 0 :(得分:1)

您可以通过将列作为数组来实现。

first,second = str.split( middle )

如果您对重复项没问题,还可以使用collect_list而不是collect_set。

答案 1 :(得分:0)

您的输入有两个不同的列,称为A1。我将假设groupBy类别称为A,而放置在该最终数组中的元素是A1。 如果将数据加载到DataFrame中,则可以执行以下操作以实现指定的输出:

import org.apache.spark.sql.functions.{collect_set, concat_ws}


val grouped = someDF
  .groupBy($"name", $"A")
  .agg(collect_set(concat_ws(",", $"A1", $"A2", $"A3", $"A4")).alias("grouped"))