【问题标题】:Spark Java: How to sort ArrayType(MapType) by key and access the values of the sorted arraySpark Java:如何按键排序ArrayType(MapType)并访问排序数组的值
【发布时间】:2021-02-17 01:55:20
【问题描述】:

所以,我有一个具有此架构的数据框:

StructType(StructField(experimentid,StringType,true), StructField(descinten,ArrayType(MapType(StringType,DoubleType,true),true),true))

内容是这样的:

+----------------+-------------------------------------------------------------+
|experimentid    |descinten                                                    |
+----------------+-------------------------------------------------------------+
|id1             |[[x1->120.51513], [x2->57.59762], [x3->83028.867]]           |
|id2             |[[x2->478.5698], [x3->79.6873], [x1->341.89]]                |
+----------------+-------------------------------------------------------------+

我想按升序对“descinten”进行排序,然后取排序后的值。我尝试分别对每一行进行映射和排序,但出现如下错误:

ClassCastException: scala.collection.mutable.WrappedArray$ofRef 无法转换为 scala.collection.Map

或类似的。在 Java 中是否有更直接的方法?

【问题讨论】:

    标签: java apache-spark collections mapping sql-order-by


    【解决方案1】:

    对于任何有兴趣的人,我设法使用地图和 TreeMap 进行排序来解决它。我的目标是根据它们的键以升序创建值的向量。

    StructType schema = new StructType(new StructField[] {
                            new StructField("expids",DataTypes.StringType, false,Metadata.empty()),
                            new StructField("intensity",new VectorUDT(),false,Metadata.empty())
                });
                Dataset<Row> newdf=olddf.map((Row originalrow) -> {
                        String firstpos = new String();
                        firstpos=originalrow.get(0).toString();
                        List<scala.collection.Map<String,Double>>mplist=originalrow.getList(1);
                        int s = mplist.size();
                        Map<String,Double>treemp=new TreeMap<>();
                        for(int k=0;k<s;k++){
                            Object[] exid = JavaConversions.mapAsJavaMap(mplist.get(k)).values().toArray();
                            Object[] kvlist= JavaConversions.mapAsJavaMap(mplist.get(k)).keySet().toArray();
                            treemp.put(exid[0].toString(),Double.parseDouble(kvlist[0].toString()));
                        }
                        Object[] yo1 = treemp.values().toArray();
                        double[] tmplist= new double[s];
                        for(int i=0;i<s;i++){
                            tmplist[i]=Double.parseDouble(yo1[i].toString());
                        }
                        Row newrow = RowFactory.create(firstpos,Vectors.dense(tmplist));
                        return newrow;
    
                }, RowEncoder.apply(schema));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-12
      • 2016-05-02
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多