JavaRDD <字符串>到JavaRDD <行>

时间:2019-03-21 11:54:24

标签: java apache-spark rdd

我正在使用以下命令将txt文件作为JavaRDD读取:

<p>{{ randomName }}</p>

现在,我想将其转换为JavaRDD,因为在该txt文件中,我有两列Integers,并希望在拆分列后向行中添加一些模式。

我也尝试过这个:

JavaRDD<String> vertexRDD = ctx.textFile(pathVertex);

但是据说我不能将映射函数分配给“对象” RDD

  1. 如何从JavaRDD中创建JavaRDD
  2. 如何使用映射到JavaRDD?

谢谢!

2 个答案:

答案 0 :(得分:0)

当您应用诸如JavaRDD之类的转换时,隐式地创建一个map是不明确的。在这里,您创建的RDD是一个字符串数组的RDD(结果为split)。

要获取行的RDD,只需从数组创建行:

JavaRDD<String> vertexRDD = ctx.textFile("");
JavaRDD<String[]> rddOfArrays = vertexRDD.map(line -> line.split("\t"));
JavaRDD<Row> rddOfRows =rddOfArrays.map(fields -> RowFactory.create(fields));

请注意,如果您的目标是将JavaRDD<Row>转换为数据帧(Dataset<Row>),则有一种更简单的方法。您可以在使用spark.read时更改定界符选项,以避免不得不使用RDD:

Dataset<Row> dataframe = spark.read()
    .option("delimiter", "\t")
    .csv("your_path/file.csv");  

答案 1 :(得分:0)

可以将这两列定义为一个类的字段,然后就可以使用

JavaRDD<Row> rows = rdd.map(new Function<ClassName, Row>() {
            @Override
            public Row call(ClassName target) throws Exception {
                return RowFactory.create(
                        target.getField1(),
                        target.getUsername(),
            }
        });

然后创建StructField, 终于使用了

StructType struct = DataTypes.createStructType(fields);
Dataset<Row> dataFrame = sparkSession.createDataFrame(rows, struct);