我正在使用带有 Java 7 的 Spark 1.6
我有一对 RDD:
JavaPairRDD<String, String> filesRDD = sc.wholeTextFiles(args[0]);
我想将其转换为DataFrame
带有模式。
看来首先我必须将pairRDD转换为RowRDD。
那么如何从 PairRDD 创建 RowRdd 呢?
我正在使用带有 Java 7 的 Spark 1.6
我有一对 RDD:
JavaPairRDD<String, String> filesRDD = sc.wholeTextFiles(args[0]);
我想将其转换为DataFrame
带有模式。
看来首先我必须将pairRDD转换为RowRDD。
那么如何从 PairRDD 创建 RowRdd 呢?
对于 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();
以下是您可以实现此目的的一种方法。
//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|
+---+------+