首页 > 解决方案 > 我们如何利用 mapreduce 或 spark 将二和算法解决为大数据问题?

问题描述

假设数字列表/数组存在于一个非常大的数据文件中,我们需要找到与特定数字“k”匹配的一对总和。我知道如何通常使用数据结构来解决它,但我想不出一种特别利用 Hadoop MR 或 spark 来解决它的方法。

假设一个文件有 1,2,3,6,7,7,8,9 我的思考过程: - 将数据考虑到一个数据框中,然后再向其中添加一列来识别差异,即如果 i<=k/2 那么其他我。那么现在我的上述数据的数据框是这样的:

数字 2号
1 9
2 8
3 7
7 7
7 7
8 8
9 9

创建 df 后,我计划使用基于 number_2 的键聚合数据。但我无法假设聚合逻辑。任何帮助将不胜感激。

标签: hadooppysparkmapreduce

解决方案


假设您有一个文件numbers.txt,名称如下:

10
5
8
7
3
6
9
11
3
1

你可以像这样实现你的目标:

int desiredSum = 15;
SparkSession spark = SparkSession
        .builder()
        .appName("My App")
        .master("local[*]")
        .getOrCreate();
Dataset<Row> rdd = spark
        .read()
        .text("numbers")
        .withColumnRenamed("value", "number")
        .withColumn("number", col("number").cast(DataTypes.LongType));
rdd.createOrReplaceTempView("myTable");
spark.sql("select first.number, second.number as number_2 from myTable  first inner join myTable second on first.number + second.number =" + desiredSum + " where first.number <= second.number").show();



+------+--------+
|number|number_2|
+------+--------+
|     5|      10|
|     7|       8|
|     6|       9|
+------+--------+

或者,如果数据很小,您可以使用 Spark 中的笛卡尔积来实现您的目标,如下所示:

int desiredSum = 15;
SparkSession spark = SparkSession
        .builder()
        .appName("My App")
        .master("local[*]")
        .getOrCreate();
Dataset<Row> rdd = spark
        .read()
        .text("numbers.txt")
        .withColumnRenamed("value", "number")
        .withColumn("number", col("number").cast(DataTypes.LongType));
Dataset<Row> joinedRdd = rdd.crossJoin(rdd.withColumnRenamed("number", "number_2")).filter("number <= number_2");
UserDefinedFunction mode = udf((UDF2<Long, Long, Object>) Long::sum, DataTypes.LongType);
joinedRdd = joinedRdd.withColumn("sum", mode.apply(col("number"), col( "number_2"))).filter("sum = " + desiredSum);
joinedRdd.show();

结果如下:

+------+--------+---+
|number|number_2|sum|
+------+--------+---+
|     5|      10| 15|
|     7|       8| 15|
|     6|       9| 15|
+------+--------+---+


**take into account the Order of time and space complexity when you use Cross join**

推荐阅读