使用Spark Java,我正在尝试使用StructType动态模式读取以JavaRDD形式包含逗号分隔值的数据。
我知道我可以使用以下方法通过传递模式(其中schemaStr-> StructType和javaRDD-> JavaRDD)来读取json:
Dataset<Row> df = spark.read().schema(schemaStr).json(javaRDD);
javaRDD has value as: name1,address11,city111
请提出如何使用StructType模式读取JavaRDD的建议,因为我用逗号分隔了以JavaRDD形式出现的数据。而且我需要使用StructType模式读取数据,因为我具有动态模式生成器实用程序,因此无论如何将其转换为数据框。
答案 0 :(得分:0)
因此,如果我理解正确,您想将JavaRDD
转换为Dataset<Row>
吗?
如果是,则可以通过拆分JavaRDD<Row>
并将其随架构传递给JavaRDD<String>
来创建spark.createDataFrame
StructType schema = new StructType(new StructField[]{
new StructField("_1", DataTypes.StringType, false, Metadata.empty()),
new StructField("_2", DataTypes.StringType, false, Metadata.empty()),
new StructField("_3", DataTypes.StringType, false, Metadata.empty())
});
JavaRDD<String> rdd1 = spark
.range(5)
.javaRDD()
.map(s -> s+",b,c");
JavaRDD<Row> rdd2 = rdd1.map(s -> s.split(","))
.map(s -> RowFactory.create((Object[]) s));
Dataset<Row> df = spark.createDataFrame(rdd2, schema);
df.show();
输出:
+---+---+---+
| _1| _2| _3|
+---+---+---+
| 0| b| c|
| 1| b| c|
| 2| b| c|
| 3| b| c|
| 4| b| c|
+---+---+---+