在spark java中使用isin函数时保持列表的顺序

Posted

技术标签:

【中文标题】在spark java中使用isin函数时保持列表的顺序【英文标题】:Retain the order of the list while using isin function in spark java 【发布时间】:2017-05-19 16:40:32 【问题描述】:

我在spark java中使用isin函数并传递id列表,需要按照传递列表的顺序检索id。但是使用isin函数后顺序发生了变化,它正在维护Dataset的顺序。

我怎样才能保留列表中的订单?

JavaSparkContext sc = new JavaSparkContext(new SparkConf().setAppName("SparkJdbcDs").setMaster("local[*]"));
SQLContext sqlContext = new SQLContext(sc);
SparkSession spark = SparkSession.builder().appName("JavaTokenizerExample").getOrCreate();

RowFactory.create("405-048011-62815", "CRC Industries"),
                RowFactory.create("630-0746","Dixon value"),
                RowFactory.create("4444-444","3M INdustries"),
                RowFactory.create("4333-444","3M INdustries"),
                RowFactory.create("4777-444","3M INdustries"),
                RowFactory.create("4444-888","3M INdustries"),
                RowFactory.create("4999-444","3M INdustries"),
                RowFactory.create("5666-55","Dixon coupling valve"));

StructType schema = new StructType(new StructField[] new StructField("label1", DataTypes.StringType, false,Metadata.empty()),
        new StructField("sentence1", DataTypes.StringType, false,Metadata.empty()) );

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

List<String> listStrings = new ArrayList<String>();
listStrings.add("5666-55");
listStrings.add("630-0746");
listStrings.add("4777-444");
listStrings.add("4444-444");


Dataset<Row> matchFound1=sentenceDataFrame.filter(col("label1").isin(listStrings.stream().toArray(String[]::new)));
matchFound1.show();

当前输出:

+--------+--------------------+

|  label1|           sentence1|

+--------+--------------------+

|630-0746|         Dixon value|

|4444-444|       3M INdustries|

|4777-444|       3M INdustries|

| 5666-55|Dixon coupling valve|

+--------+--------------------+

预期输出:

+--------+--------------------+

|  label1|           sentence1|

+--------+--------------------+

| 5666-55|Dixon coupling valve|

|630-0746|         Dixon value|

|4777-444|       3M INdustries|

|4444-444|       3M INdustries|

+--------+--------------------+

【问题讨论】:

一些选项 1) 按标签对 DataFrame 进行排序。 2)改为加入,可能还需要做#1。大规模性能可能会更好,尤其是在使用 sql.functions.broadcast 连接提示时。 3)不适合大 DF,但你可以 collectAsList 并以这种方式进行匹配。 4) 映射值,查找匹配项并仅使用那些匹配的记录创建新列表/DF。 5)对分区进行排序(并明确地只制作 1 用于测试该理论)然后进行匹配。在电话上,所以我无法正确测试我的建议 ATM 无法排序,因为标签有连字符(-) 【参考方案1】:

我建议你创建一个dataframe 而不是list 并加入sentenceDataFrame,你也会保留订单。这比创建listfiltering 更有效。

【讨论】:

以上是关于在spark java中使用isin函数时保持列表的顺序的主要内容,如果未能解决你的问题,请参考以下文章

Spark的Column.isin函数不带List

Scala Spark isin 广播列表

pandas使用isin函数和all函数判断dataframe特定数列中是否包含指定列表中的全部内容

pandas使用isin函数和any函数判断dataframe特定数列中是否包含至少一个指定列表中的内容

如何在 Java 中使用 Column.isin?

如何将 Column.isin 与列表一起使用?