我正在尝试使用StructType动态模式,使用Spark Java,以JavaRDD的形式读取具有逗号分隔值的数据。

我知道我可以使用以下通过架构的方法读取json(其中schemaStr-> StructType和javaRDD-> JavaRDD):

Dataset<Row> df = spark.read().schema(schemaStr).json(javaRDD);


javaRDD has value as: name1,address11,city111


请提出如何使用StructType模式读取JavaRDD的建议,因为我用逗号分隔了以JavaRDD形式出现的数据。而且我需要使用StructType模式读取数据,因为我有一个动态模式生成器实用程序,因此无论如何将其转换为数据框。

最佳答案

所以如果我理解正确,您想将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|
+---+---+---+

关于java - 如何在Spark Java中使用StructType模式从JavaRDD <String>读取csv格式数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58333076/

10-09 02:08