在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
,你也会保留订单。这比创建list
和filtering
更有效。
【讨论】:
以上是关于在spark java中使用isin函数时保持列表的顺序的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用isin函数和all函数判断dataframe特定数列中是否包含指定列表中的全部内容