【问题标题】:Delete Rows in apache spark using java使用java删除apache spark中的行
【发布时间】:2017-06-09 10:24:55
【问题描述】:

需要删除该数据集中的第二行我是 apache spark 的新手,谁能帮我解决。 下面是代码:

  public class DeleteRow {
         public static void main(String[] args) {
          System.setProperty("hadoop.home.dir", "C:\\winutils");
          JavaSparkContext sc = new JavaSparkContext(new SparkConf().setAppName("JoinFunctions").setMaster("local[*]"));
          SQLContext sqlContext = new SQLContext(sc);
          SparkSession spark = SparkSession.builder().appName("JavaTokenizerExample").getOrCreate();

          List<Row> data = Arrays.asList(
            RowFactory.create(1,"Hi I heard about Spark"),
            RowFactory.create(2,"I wish Java could use case classes"),
            RowFactory.create(3,"Logistic,regression,models,are,neat"));

          StructType schema = new StructType(new StructField[] {
            new StructField("label", DataTypes.IntegerType, false,
              Metadata.empty()),
          new StructField("sentence", DataTypes.StringType, false,
            Metadata.empty()) });

            String ins  = data.get(1).toString();
            System.out.println(ins);



          Dataset<Row> sentenceDataFrame = spark.createDataFrame(data, schema);
        sentenceDataFrame.drop(data.get(1).toString());

任何帮助表示赞赏。

【问题讨论】:

  • 您想如何定义要删除的行?您是否希望所有元素都与所选行相同?你想通过一些索引来做吗?匹配某个参数的所有行?
  • 以上示例我想删除第二行(“我希望 Java 可以使用案例类”)
  • 所以你想要索引?即给每一行一个ID并按该ID删除?给每一行一个连续的 id (0,1,2) 可能会很昂贵。哈希(以及删除多个哈希的风险)是否足够好?
  • 您是否需要除第 2 行以外的所有行并且所有标签都是唯一的?
  • 是的,我想要除第 2 行以外的所有行,提前致谢。

标签: apache-spark apache-spark-sql apache-spark-mllib apache-spark-ml apache-spark-dataset


【解决方案1】:

使用 FilterFunction。

我写了一个 JUnit 测试来帮助你。

@Test
public void sampleDeleteRowTest() throws Exception {
    List<Row> data = Arrays.asList(
            RowFactory.create(1, "Hi I heard about Spark"),
            RowFactory.create(2, "I wish Java could use case classes"),
            RowFactory.create(3, "Logistic,regression,models,are,neat"));

    StructType schema = new StructType(new StructField[]{
            new StructField("label", DataTypes.IntegerType, false,
                    Metadata.empty()),
            new StructField("sentence", DataTypes.StringType, false,
                    Metadata.empty())});

    String ins = data.get(1).toString();
    System.out.println(ins);


    Dataset<Row> sentenceDataFrame = spark.createDataFrame(data, schema);
    long size = sentenceDataFrame.count();

    assertTrue("SentenceDataFrame Size = " + sentenceDataFrame.count(), size == 3);

    sentenceDataFrame = sentenceDataFrame.filter(new FilterFunction<Row>() {
        @Override
        public boolean call(Row row) throws Exception {
            Integer label = row.getInt(0);
            return label != 2;
        }
    });

    size = sentenceDataFrame.count();

    assertTrue("SentenceDataFrame Size = " + sentenceDataFrame.count(), size == 2);
}

https://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/sql/Dataset.html#filter(org.apache.spark.api.java.function.FilterFunction)

https://spark.apache.org/docs/2.1.0/api/java/org/apache/spark/api/java/function/FilterFunction.html

或者,您可以使用 Lambda 函数来实现相同的预期结果:

sentenceDataFrame = sentenceDataFrame.filter((FilterFunction<Row>) r -> (r).getInt(0) != 2);

【讨论】:

    猜你喜欢
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2017-06-10
    • 1970-01-01
    • 2015-11-29
    • 2013-06-19
    相关资源
    最近更新 更多