我有一个数据集,其中包含许多列(actuall 11000,但可能更多)和大约40000行。我想做的是将UDF应用于所有这些列(此UDF只是通过用字符替换来缩短列的字符串)。我的方法工作正常,但实际上效率不高,因为我使用了for循环来迭代所有列。有没有机会使用foreach()函数或类似的东西来并行执行所有11000列的执行?
sqlContext.udf().register("replaceStringByChar", replaceStringByChar, DataTypes.StringType);
for (String c : ds.columns()) {
ds = ds.withColumn(c, functions.callUDF("replaceStringByChar", ds.col(c)));
}
答案 0 :(得分:0)
我认为类似的东西应该有用
ds.columns().foreach(column -> {
System.out.println("Column" + column);
});
答案 1 :(得分:0)
我遇到了类似的问题,并且找到了使用withColumns
对象的Dataset<Row>
方法的解决方案。检查这篇文章:
Iterate over different columns using withcolumn in Java Spark
对于您的情况将是这样的:
List<String> fieldsNameList = ds.columns();
Seq<String> fieldsNameSeq = JavaConversions.asScalaBuffer(fieldsNameList).seq();
List<Column> whenColumnList = new ArrayList(Arrays.asList());
for (String c : ds.columns()) {
Column whenColumn = functions.callUDF("replaceStringByChar", ds.col(c))
whenColumnList.add(whenColumn)
}
Seq<Column> whenColumnSeq = JavaConversions.asScalaBuffer(whenColumnList).seq();
Dataset<Row> ds_new = ds.withColumns(fieldsNameSeq, whenColumnSeq);