在Java中使用Apache Spark 1.4向数据框添加一列

时间:2015-09-15 16:20:24

标签: java apache-spark

我正在尝试向我的DataFrame添加一列,作为列的唯一ROW_ID。所以,它会是这样的 1,user1 2,user2 3,user3 ... 我可以使用带有整数迭代的hashMap轻松完成此操作,但我无法在使用DataFrame上的map函数的spark中执行此操作,因为我无法在map函数内增加整数。有没有办法通过将一列添加到现有的DataFrame或任何其他方式来实现此目的? PS:我知道有一个非常similar post,但这是针对Scala而不是java。

提前致谢

2 个答案:

答案 0 :(得分:4)

我是通过在DataFrame的新列中添加包含UUID的列来完成的。

StructType objStructType = inputDataFrame.schema();
        StructField []arrStructField=objStructType.fields();
        List<StructField> fields = new ArrayList<StructField>();
        List<StructField> newfields = new ArrayList<StructField>();
        List <StructField> listFields = Arrays.asList(arrStructField);
        StructField a = DataTypes.createStructField(leftCol,DataTypes.StringType, true);
        fields.add(a);
        newfields.addAll(listFields);
        newfields.addAll(fields);
        final int size = objStructType.size();

    JavaRDD<Row> rowRDD =   inputDataFrame.javaRDD().map(new Function<Row, Row>() {
        private static final long serialVersionUID = 3280804931696581264L;
        public Row call(Row tblRow) throws Exception {

                Object[] newRow = new Object[size+1];
                int rowSize=    tblRow.length();
                for (int itr = 0; itr < rowSize; itr++)
                {
                    if(tblRow.apply(itr)!=null)
                    {
                        newRow[itr] = tblRow.apply(itr);
                    }

                }
                newRow[size] = UUID.randomUUID().toString();
                return RowFactory.create(newRow);

        }
    });



    inputDataFrame = objsqlContext.createDataFrame(rowRDD, DataTypes.createStructType(newfields));

答案 1 :(得分:1)

好的,我找到了这个问题的解决方案,我发布了以防有人遇到同样的问题:

从JavaRDD()

获取zipWithIndex的方法

df.javaRDD().zipWithIndex().map(new Function<Tuple2<Row, Long>, Row>() { @Override public Row call(Tuple2<Row, Long> v1) throws Exception { return RowFactory.create(v1._1().getString(0), v1._2()); } })