我正在使用以下命令将txt文件作为JavaRDD读取:
<p>{{ randomName }}</p>
现在,我想将其转换为JavaRDD,因为在该txt文件中,我有两列Integers,并希望在拆分列后向行中添加一些模式。
我也尝试过这个:
JavaRDD<String> vertexRDD = ctx.textFile(pathVertex);
但是据说我不能将映射函数分配给“对象” RDD
谢谢!
答案 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);