我们如何利用mapreduce或spark解决二和算法作为大数据问题?

bihw5rsg  于 2021-07-15  发布在  Hadoop
关注(0)|答案(1)|浏览(491)

假设数字的列表/数组存在于一个非常庞大的数据文件中,我们需要找到与特定数字“k”匹配的一对和。我知道如何解决它通常使用数据结构,但我无法想到一种方法来解决它利用hadoopmr或Spark特别。
假设一个文件有1,2,3,6,7,7,8,9我的思考过程:-将数据考虑到一个Dataframe中,然后再向其中添加一个列来标识差异,即如果i<=k/2,则k-i else i。现在,我对上述数据的Dataframe如下所示:
号码号码21928377778899
一旦创建了df,我就计划根据数字2用key聚合数据。但我无法假设聚合逻辑。任何帮助都将不胜感激。

pgccezyw

pgccezyw1#

假设您有一个名为 numbers.txt 如下所示:

  1. 10
  2. 5
  3. 8
  4. 7
  5. 3
  6. 6
  7. 9
  8. 11
  9. 3
  10. 1

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

  1. int desiredSum = 15;
  2. SparkSession spark = SparkSession
  3. .builder()
  4. .appName("My App")
  5. .master("local[*]")
  6. .getOrCreate();
  7. Dataset<Row> rdd = spark
  8. .read()
  9. .text("numbers")
  10. .withColumnRenamed("value", "number")
  11. .withColumn("number", col("number").cast(DataTypes.LongType));
  12. rdd.createOrReplaceTempView("myTable");
  13. 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();
  14. +------+--------+
  15. |number|number_2|
  16. +------+--------+
  17. | 5| 10|
  18. | 7| 8|
  19. | 6| 9|
  20. +------+--------+

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

  1. int desiredSum = 15;
  2. SparkSession spark = SparkSession
  3. .builder()
  4. .appName("My App")
  5. .master("local[*]")
  6. .getOrCreate();
  7. Dataset<Row> rdd = spark
  8. .read()
  9. .text("numbers.txt")
  10. .withColumnRenamed("value", "number")
  11. .withColumn("number", col("number").cast(DataTypes.LongType));
  12. Dataset<Row> joinedRdd = rdd.crossJoin(rdd.withColumnRenamed("number", "number_2")).filter("number <= number_2");
  13. UserDefinedFunction mode = udf((UDF2<Long, Long, Object>) Long::sum, DataTypes.LongType);
  14. joinedRdd = joinedRdd.withColumn("sum", mode.apply(col("number"), col( "number_2"))).filter("sum = " + desiredSum);
  15. joinedRdd.show();

结果如下:

  1. +------+--------+---+
  2. |number|number_2|sum|
  3. +------+--------+---+
  4. | 5| 10| 15|
  5. | 7| 8| 15|
  6. | 6| 9| 15|
  7. +------+--------+---+
  8. **take into account the Order of time and space complexity when you use Cross join**
展开查看全部

相关问题