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