Java 如何创建RowEncoder来映射元组<;A、 世界其他地区>;划船?

Java 如何创建RowEncoder来映射元组<;A、 世界其他地区>;划船?,java,apache-spark,apache-spark-sql,Java,Apache Spark,Apache Spark Sql,我有一个spark数据集,根据需要对数据进行分组和缩减。我需要去掉tuple,只保留Tuple2::\u 2。 我正在尝试按如下方式映射数据集: sparkSession.read() .parquet("s3://stuff/*") .groupByKey((MapFunction<Row, Long>) value -> { long stamp = value.getAs("timeStamp

我有一个spark数据集,根据需要对数据进行分组和缩减。我需要去掉tuple,只保留Tuple2::\u 2。 我正在尝试按如下方式映射数据集:

sparkSession.read()
            .parquet("s3://stuff/*")
            .groupByKey((MapFunction<Row, Long>) value -> {
                long stamp = value.getAs("timeStamp");
                return stamp / 600000;
            }, Encoders.LONG())
            .reduceGroups((ReduceFunction<Row>) (v1, v2) -> {
                int fare1 = v1.getAs("totalFare");
                int fare2 = v2.getAs("totalFare");
                return fare1 < fare2 ? v1 : v2;
            })
            .map((MapFunction<Tuple2<Long, Row>, Row>) Tuple2::_2, RowEncoder.apply(null))
sparkSession.read()
            .parquet("s3://stuff/*")
            .as(Encoder...)  // <-- I don't know how to write a tuple of (long, int) in Java
sparkSession.read()
.parquet(“s3://stuff/*”)
.groupByKey((映射函数)值->{
长戳=value.getAs(“时间戳”);
回邮邮票/600000;
},Encoders.LONG())
.还原组((还原功能)(v1,v2)->{
int fare1=v1.getAs(“总票价”);
int fare2=v2.getAs(“总票价”);
往返票价1<票价2?v1:v2;
})
.map((MapFunction)Tuple2::2,RowEncoder.apply(null))
无法确定如何向RowEncoder::apply提供架构。
我正在阅读一个带有模式的拼花地板文件。

我没有将Java与Spark一起使用,所以我不能说得更具体,但是

如果我没有弄错的话,您只想使用
时间戳
总票价
字段<代码>时间戳为长类型,而
总票价
为整数类型

我的第一个建议是使用操作符将非类型化的
保留为
数据集[Long,Int]
(在Scala中):

公共数据集as(编码器证据$2)返回一个新数据集,其中每个记录都已映射到指定类型

这样可以避免处理这个不愉快的
对象,您的转换如下所示:

sparkSession.read()
            .parquet("s3://stuff/*")
            .groupByKey((MapFunction<Row, Long>) value -> {
                long stamp = value.getAs("timeStamp");
                return stamp / 600000;
            }, Encoders.LONG())
            .reduceGroups((ReduceFunction<Row>) (v1, v2) -> {
                int fare1 = v1.getAs("totalFare");
                int fare2 = v2.getAs("totalFare");
                return fare1 < fare2 ? v1 : v2;
            })
            .map((MapFunction<Tuple2<Long, Row>, Row>) Tuple2::_2, RowEncoder.apply(null))
sparkSession.read()
            .parquet("s3://stuff/*")
            .as(Encoder...)  // <-- I don't know how to write a tuple of (long, int) in Java
sparkSession.read()
.parquet(“s3://stuff/*”)

.as(Encoder…/所以我就这样做了。基本上读取1个元素以获得所需的“ExpressionEncoder”。我需要最终输出中的完整“行”,因此无法继续@Jacek的方法

System.out.println("Starting");
System.out.println(Arrays.toString(args));
Row sampleRow = sparkSession.read().parquet(readFrom).head();
ExpressionEncoder<Row> rowEncoder = RowEncoder.apply(sampleRow.schema());

//read all elements, process and write back the result
sparkSession.read()
            .parquet(readFrom)
            .groupByKey((MapFunction<Row, Long>) value -> {
                long stamp = value.getAs("timeStamp");
                return stamp / 600000;
            }, Encoders.LONG())
            .reduceGroups((ReduceFunction<Row>) (v1, v2) -> {
                int fare1 = v1.getAs("totalFare");
                int fare2 = v2.getAs("totalFare");
                return fare1 < fare2 ? v1 : v2;
            })
            .map((MapFunction<Tuple2<Long, Row>, Row>) Tuple2::_2, rowEncoder)
            .write()
            .parquet(writeTo);
System.out.println("Done !!!!");
System.out.println(“启动”);
System.out.println(Arrays.toString(args));
Row sampleRow=sparkSession.read().parquet(readFrom.head();
expressionEncoderRowEncoder=rowEncoder.apply(sampleRow.schema());
//读取所有元素,处理并写回结果
sparkSession.read()
.拼花地板(阅读)
.groupByKey((映射函数)值->{
长戳=value.getAs(“时间戳”);
回邮邮票/600000;
},Encoders.LONG())
.还原组((还原功能)(v1,v2)->{
int fare1=v1.getAs(“总票价”);
int fare2=v2.getAs(“总票价”);
往返票价1<票价2?v1:v2;
})
.map((MapFunction)Tuple2::2,行编码器)
.write()
.拼花地板(书面);
System.out.println(“完成!!!!”);