Spark将Dataframe映射到另一个Dataframe

时间:2017-02-14 16:15:04

标签: java apache-spark spark-dataframe

我正在尝试将数据帧的列解析为两个不同的列(目的是将这些列添加到数据帧中)。我尝试了两种方法。两者都会导致问题。任何人都可以告诉我如何使用其中一种方法实现这一目标或者暗示我采用不同的方法吗?

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

2 个答案:

答案 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”中。