首页 > 解决方案 > 如何从 JavaRDD 中读取 csv 格式的数据在 Spark Java 中使用 StructType Schema

问题描述

使用 Spark Java,我正在尝试使用 StructType 动态模式读取具有 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 模式读取数据,以将其转换为数据框,因为我有一个动态模式生成器实用程序。

标签: javaapache-sparkapache-spark-sql

解决方案


所以如果我理解正确,你想转换JavaRDDDataset<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|
+---+---+---+

推荐阅读