0

我正在使用带有 Java 7 的 Spark 1.6

我有一对 RDD:

JavaPairRDD<String, String> filesRDD = sc.wholeTextFiles(args[0]);

我想将其转换为DataFrame带有模式。

看来首先我必须将pairRDD转换为RowRDD。

那么如何从 PairRDD 创建 RowRdd 呢?

4

2 回答 2

5

对于 Java 7,您需要定义一个映射函数

public static final Function<Tuple2<String, String>,Row> mappingFunc = (tuple) -> {
    return RowFactory.create(tuple._1(),tuple._2());
};

现在你可以调用这个函数来获取JavaRDD<Row>

JavaRDD<Row> rowRDD = filesRDD.map(mappingFunc);

使用 Java 8 就像

JavaRDD<Row> rowRDD = filesRDD.map(tuple -> RowFactory.create(tuple._1(),tuple._2()));

从 JavaPairRDD 获取 Dataframe 的另一种方法是

DataFrame df = sqlContext.createDataset(JavaPairRDD.toRDD(filesRDD), Encoders.tuple(Encoders.STRING(),Encoders.STRING())).toDF();
于 2017-05-25T04:32:55.807 回答
0

以下是您可以实现此目的的一种方法。

    //Read whole files
    JavaPairRDD<String, String> pairRDD = sparkContext.wholeTextFiles(path);

    //create a structType for creating the dataframe later. You might want to
    //do this in a different way if your schema is big/complicated. For the sake of this
    //example I took a simple one.
    StructType structType = DataTypes
            .createStructType(
                    new StructField[]{
                            DataTypes.createStructField("id", DataTypes.StringType, true)
                            , DataTypes.createStructField("name", DataTypes.StringType, true)});


    //create an RDD<Row> from pairRDD
    JavaRDD<Row> rowJavaRDD = pairRDD.values().flatMap(new FlatMapFunction<String, Row>() {
        public Iterable<Row> call(String s) throws Exception {
            List<Row> rows = new ArrayList<Row>();
            for (String line : s.split("\n")) {
                String[] values = line.split(",");
                Row row = RowFactory.create(values[0], values[1]);
                rows.add(row);
            }
            return rows;
        }
    });


    //Create Dataframe.
    sqlContext.createDataFrame(rowJavaRDD, structType);

我使用
File1 的示例数据:

1, john  
2, steve

文件2:

3, Mike  
4, Mary  

df.show() 的输出:

+---+------+
| id|  name|
+---+------+
|  1|  john|
|  2| steve|
|  3|  Mike|
|  4|  Mary|
+---+------+
于 2017-05-25T03:31:19.023 回答