如何从Spark Java的数组列中选择字段的子集?

时间:2018-11-24 08:59:14

标签: java apache-spark-sql

此问题与此处发布的问题相同。它对scala有一个公认的答案。但是我需要在Java中实现相同的功能。

How to select a subset of fields from an array column in Spark?

import org.apache.spark.sql.Row

case class Record(id: String, size: Int)

val dropUseless = udf((xs: Seq[Row]) =>  xs.map{
  case Row(id: String, size: Int, _) => Record(id, size)
})

df.select(dropUseless($"subClasss"))

我试图在Java中实现上述功能,但无法正常运行。感谢任何帮助。谢谢

this.spark.udf().register("dropUseless",
            (UDF1<Seq<Row>, Seq<Row>>) rows -> {
                Seq<Row> seq = JavaConversions
                    .asScalaIterator(
                        JavaConversions.seqAsJavaList(rows)
                            .stream()
                            .map((Row t) -> RowFactory.create(new Object[] {t.getAs("id"), t.getAs("size")})
                            ).iterator())
                    .toSeq();
                return seq;
            }, DataTypes.createStructType(Arrays.asList(
                DataTypes.createStructField("id", DataTypes.StringType, false),
                DataTypes.createStructField("size", DataTypes.IntegerType, true))
                )
            );

1 个答案:

答案 0 :(得分:0)

如果我们假设您有一个数据框(df),则可以使用本机SQL提取一个新的数据框(ndf),其中可以包含所需的结果。

尝试一下:

df.registerTempTable("df");

Dataframe ndf = sqlContext.sql("SELECT ..... FROM df WHERE ...");