Java 根据值将数据集分组为不同的子数据集

Java 根据值将数据集分组为不同的子数据集,java,apache-spark,dataset,grouping,Java,Apache Spark,Dataset,Grouping,我想在由以下几列组成的数据集上实现一个程序: +-----------+---------------+-------------------+-----------------------+ |项目标识|产品名称|制造商名称|产品描述| +-----------+---------------+-------------------+-----------------------+ |12345 |钢笔|大提琴|圆珠笔软笔尖| |12346 |铅笔| Nataraja |铅笔HB额外D| |4

我想在由以下几列组成的数据集上实现一个程序:

+-----------+---------------+-------------------+-----------------------+
|项目标识|产品名称|制造商名称|产品描述|
+-----------+---------------+-------------------+-----------------------+
|12345 |钢笔|大提琴|圆珠笔软笔尖|
|12346 |铅笔| Nataraja |铅笔HB额外D|
|42345 |统治者|纳塔拉贾|比例尺1103 15c|
|12677 |卷笔刀| Nataraja |铅笔卷笔刀|
|12987 |钢笔|雷诺兹|圆点钢笔额外Gr|
|44326 |钢笔|雷诺兹|中性笔德国T|
|13456 |钢笔|大提琴|圆点笔0.5mm笔尖|
|19876 |橡皮擦|大提琴|无尘橡皮擦|
|43246 |墨水笔|英雄|墨水笔流畅哈|
+-----------+---------------+-------------------+-----------------------+
我想根据
制造商名称对数据集进行分组,如下所示

制造商=大提琴
+-----------+---------------+-------------------+-----------------------+
|项目标识|产品名称|制造商名称|产品描述|
+-----------+---------------+-------------------+-----------------------+
|12345 |钢笔|大提琴|圆珠笔软笔尖|
|13456 |钢笔|大提琴|圆点笔0.5mm笔尖|
|19876 |橡皮擦|大提琴|无尘橡皮擦|
+-----------+---------------+-------------------+-----------------------+
制造商=Nataraja
+-----------+---------------+-------------------+-----------------------+
|项目标识|产品名称|制造商名称|产品描述|
+-----------+---------------+-------------------+-----------------------+
|12346 |铅笔| Nataraja |铅笔HB额外D|
|42345 |统治者|纳塔拉贾|比例尺1103 15c|
|12677 |卷笔刀| Nataraja |铅笔卷笔刀|
+-----------+---------------+-------------------+-----------------------+
制造商=雷诺
+-----------+---------------+-------------------+-----------------------+
|项目标识|产品名称|制造商名称|产品描述|
+-----------+---------------+-------------------+-----------------------+
|12987 |钢笔|雷诺兹|圆点钢笔额外Gr|
|44326 |钢笔|雷诺兹|中性笔德国T|
+-----------+---------------+-------------------+-----------------------+
制造商=英雄
+-----------+---------------+-------------------+-----------------------+
|项目标识|产品名称|制造商名称|产品描述|
+-----------+---------------+-------------------+-----------------------+
|43246 |墨水笔|英雄|墨水笔流畅哈|
+-----------+---------------+-------------------+-----------------------+
我尝试使用下面的代码,但没有得到好的结果。帮我改进这个程序。以下是我使用的代码:

Dataset<Row> countsBy = src.select("Manufacturer_Name").distinct();
List<Row> lsts = countsBy.collectAsList();
for (Row lst : lsts) {
    String man = lst.toString();
    System.out.println("Records of " + man + " only");
    Dataset<Row> mandataset = src.filter("Manufacturer_Name='" + man + "'");
    mandataset.show();
}
Dataset countsBy=src.select(“制造商名称”).distinct();
List lsts=countsBy.collectAsList();
用于(行lst:lsts){
字符串man=lst.toString();
System.out.println(“仅“+man+”的记录”);
数据集mandataset=src.filter(“制造商名称=”“+man+””);
show();
}

也许你可以尝试制作一个数据集的地图,用一个字符串(制造商名称)键,在每次迭代中,你检查制造商名称,然后检查它是否已经在地图中(如果需要,你可以创建它),最后,你将你的行添加到好的数据集中

你会有这样的东西:

Map<string,ArrayList<ShopItem>> dic = new HashMap<string,ArrayList<ShopItem>>();
for(/*...*/)
{
  string Manufacturer_Name = //you get the name
  if(/*the Manufacturer_Name is not in dic*/)
  {
    dic.put(Manufacturer_Name,new ArrayList<ShopItem>());
  }
  dic.get(Manufacturer_Name).Add(/*what you want to add*/);
}
Map dic=newhashmap();
对于(/*…*/)
{
string Manufacturer\u Name=//获取名称
如果(/*制造商名称不在dic*/)
{
dic.put(制造商名称,新ArrayList());
}
dic.get(制造商名称)。添加(/*您要添加的内容*/);
}
然后需要第二个循环,但仅用于打印数据

我希望它能解决你的问题

编辑:按地图(对不起)和提供链接放置词典


编辑:更改代码以匹配新想法

也许您可以尝试制作一个数据集地图,使用键一个字符串(制造商名称),在每次迭代中,您检查制造商名称,然后检查它是否已经在地图中(如果需要,您可以创建它),最后,您将行添加到良好的数据集中

你会有这样的东西:

Map<string,ArrayList<ShopItem>> dic = new HashMap<string,ArrayList<ShopItem>>();
for(/*...*/)
{
  string Manufacturer_Name = //you get the name
  if(/*the Manufacturer_Name is not in dic*/)
  {
    dic.put(Manufacturer_Name,new ArrayList<ShopItem>());
  }
  dic.get(Manufacturer_Name).Add(/*what you want to add*/);
}
Map dic=newhashmap();
对于(/*…*/)
{
string Manufacturer\u Name=//获取名称
如果(/*制造商名称不在dic*/)
{
dic.put(制造商名称,新ArrayList());
}
dic.get(制造商名称)。添加(/*您要添加的内容*/);
}
然后需要第二个循环,但仅用于打印数据

我希望它能解决你的问题

编辑:按地图(对不起)和提供链接放置词典


编辑:更改代码以匹配新想法

能否更具体地说明不良结果?是缓慢还是错误?我希望数据集的子集在迭代部分之外可用。因为它是在本地声明的,并且每次迭代都会被覆盖,所以除了在上一次迭代中生成的子集之外,我不能使用所有的子集@奥古斯丁·博肯:你能更具体地谈谈糟糕的结果吗?是缓慢还是错误?我希望数据集的子集在迭代部分之外可用。因为它是在本地声明的,并且每次迭代都会被覆盖,所以除了在上一次迭代中生成的子集之外,我不能使用所有的子集@Augustinbocken只是想在实施前澄清几件事。能给我一本字典吗