我正在尝试将数据帧的列解析为两个不同的列(目的是将这些列添加到数据帧中)。我尝试了两种方法。两者都会导致问题。任何人都可以告诉我如何使用其中一种方法实现这一目标或者暗示我采用不同的方法吗?
Dataset<Row>
映射到Dataset<Tuple2<String, String>>
Dataset<Tuple2<String, String>> dfParsed = df.map(new MapFunction<Row, Tuple2<String, String>>
() {
@Override
public Tuple2<String, String> call(Row value) throws Exception {
// Parse the column
String opsCode = value.getAs("OPSCODE");
String[] splitted = opsCode.split("[\\.|\\-]");
return new Tuple2<>(splitted[1], splitted[2]);
}
}, Encoders.tuple(Encoders.STRING(), Encoders.STRING()));
这很有效。但是在dfParsed
中,两列都被命名为value
,我无法选择它们将它们添加到原始数据框中。
Dataset<Row>
映射到Dataset<Row>
Dataset<Row> dfParsed = df.map(new MapFunction<Row, Row>() {
@Override
public Row> call(Row value) throws Exception {
// Parse the column
String opsCode = value.getAs("OPSCODE");
String[] splitted = opsCode.split("[\\.|\\-]");
//return RowFactory.create(splitted[1], splitted[2]);
}
}, ???);
这种方法不起作用,因为我不知道选择哪个Encoder
。
答案 0 :(得分:2)
首次尝试重命名列后,您只需致电toDF(columnNames)
。
output.toDF("col1", "col2", ...)
答案 1 :(得分:0)
使用selectExpr
语句可以更轻松地工作,因为它已经将新列附加到数据帧。 (并且可以避免添加连接声明或类似声明)
Dataset<Row> dfParsed = df.selectExpr("*",
"split(OPSCODE, '[\\.|\\-]')[1] as OPSCODE_CAT",
"split(OPSCODE, '[\\.|\\-]')[2] as OPSCODE_PROC ");
SQL split
命令用于将列“OPSCODE”与正则表达式分开。分割字符串的第二部分存储在新列“OPSCODE_CAT”中,第三部分存储在“OPSCODE_PROC”中。